tree: 425306f3b1f81aa620bd2b85aca7f28bd7dffe46 [path history] [tgz]
  1. common/
  2. device/
  3. ffx_optional_moniker/
  4. gen/
  5. list-devices/
  6. play/
  7. record/
  8. src/
  9. BUILD.gn
  10. OWNERS
  11. README.md
src/developer/ffx/plugins/audio/README.md

ffx audio

Usage

Generate audio signals

Use ffx audio gen <signal-type> to generate an audio signal of a given type: sine, square, triangle, sawtooth, pink-noise, or white-noise.

This command outputs audio in WAV format to standard out. This can be redirected to a file or piped directly into commands like ffx audio play or ffx audio device play.

ffx audio gen <signal-type> --duration 5ms --frequency 440 --amplitude 0.5 --format 48000,int16,2ch

Interact with audio_core

The ffx audio play and ffx audio record commands render and capture audio from the audio_core AudioRenderer and AudioCapturer APIs, respectively.

These commands accept options to set usage, gain, mute, clock, and buffer size for the shared VMO between the audio_ffx_daemon on target and the AudioRenderer/AudioCapturer. See ffx audio play --help and ffx audio record --help for details.

Tip: To use the ultrasound renderer and capturer, use the option --usage ultrasound.

ffx audio play
ffx audio play --file ~/path/to/file.wav
ffx audio record
ffx audio play --usage ultrasound
ffx audio record --usage ultrasound

Interact with attached devices

Use ffx audio device list to see which devices are connected. The device name field can be used to specify a device for other ffx audio device commands.

ffx audio device list

Filter the devices with optional flags. See ffx audio device help for more information about filter flags.

Specify --name <name> to select a device by name:

ffx audio device --name 3d99d780

Specify --token-id <id> to select a device by audio device registry (ADR) token ID:

ffx audio device --token-id 1

Specify --direction {input,output} to select a device by direction. This only applies to StreamConfig devices.

ffx audio device --direction input

ffx audio device subcommands that operate on a single device (all except list) choose the first device in the list, after filtering.

Use ffx audio device info to print additional information about a specific device.

ffx audio device --name <name> info

Use ffx audio device play and ffx audio device record to play or record an audio signal. from the hardware ring buffer.

Note: These commands communicate directly with the device. To avoid conflicts, the target build should not have audio_core present.

ffx audio device --name <name> record
ffx audio device --name <name> play
ffx audio device --name <name> play --file ~/path/to/file.wav

Other Tips

  • Run play and record commands at the same time to verify that a signal is rendered and captured correctly.

    Verify that the output of the record command matches what is expected from the play command.

  • Play a looped WAV file:

    Use ffmpeg to output a looped audio signal for a given WAV file to standard out, then pipe it to ffx audio device play:

    ffmpeg -stream_loop <N> -i <filename> -c copy -f wav -
    

    Where:

    • <N> is the number of times to loop, or -1 to loop infinitely
    • <filename> is the input WAV file
    • The file - outputs to stdout

    The following command infinitely loops a WAV file and sends it to the device ring buffer:

    ffmpeg -stream_loop -1 -i <filename> -c copy -f wav - | ffx audio device play
    

Architecture

ffx audio

ffx audio commands, except for gen, interact with the target through the fuchsia.audio.controller FIDL protocols, served by the audio_ffx_daemon component.

audio_ffx_daemon

audio_ffx_daemon is a Fuchsia component that proxies audio commands and data from ffx audio commands to audio devices and audio_core.

The audio_core APIs and device ring buffers use Zircon virtual memory objects (VMOs) that are not accessible to ffx plugins. audio_ffx_daemon provides a Zircon socket interface to transfer audio data between the host and target, and executes audio commands on behalf of the ffx client.

The audio_dev_support assembly input bundle contains the daemon and is enabled only for eng build types.