Skip to content

Audio Capture (ALSA / PulseAudio / PipeWire)

The Pengo exposes a single USB Audio Class device with two logical inputs that show up mixed:

  1. The HDMI-embedded audio (whatever the HDMI source is sending)
  2. The 3.5 mm microphone input (mono, mic-level)

And one logical output:

  • The 3.5 mm headphone jack (stereo, 48 kHz / 16-bit)

This page covers how to address each one from ALSA, PulseAudio, and PipeWire on Linux.

Identifying the device

arecord -l

Sample output:

card 1: Grabber [Pengo HDMI Grabber], device 0: USB Audio [USB Audio]
  Subdevices: 1/1
  subdevice #0: subdevice #0

In the rest of this page we'll refer to the card by its index (1 in this example) — substitute your own number when running commands.

Quick sanity test:

arecord -D hw:1,0 -f S16_LE -r 48000 -c 2 -d 5 /tmp/test.wav
aplay /tmp/test.wav

If you hear the source's audio, ALSA is happy. If the volume is too low or too hot, see the levels section below.

ALSA

Record with arecord

arecord -D hw:1,0 -f S16_LE -r 48000 -c 2 -d 60 /tmp/capture.wav
  • -f S16_LE — 16-bit signed little-endian (matches the Pengo's 16-bit output)
  • -r 48000 — 48 kHz (the Pengo's spec)
  • -c 2 — stereo (the Pengo mixes HDMI and mic into a stereo stream)
  • -d 60 — duration in seconds

Pipe to FFmpeg for instant re-encode to MP3/Opus/AAC:

arecord -D hw:1,0 -f S16_LE -r 48000 -c 2 - | \
    ffmpeg -f s16le -ar 48000 -ac 2 -i - -c:a libmp3lame -b:a 192k \
        /tmp/capture.mp3

Mix with FFmpeg

ffmpeg -f v4l2 -input_format mjpeg -framerate 60 -video_size 1920x1080 \
       -i /dev/video0 \
       -f alsa -ac 2 -i hw:1,0 \
       -c:v copy -c:a aac -b:a 192k \
       /tmp/capture.mp4

ALSA controls

The Pengo doesn't expose many controls, but alsamixer will show what's available. Run:

alsamixer -c 1

You'll see controls like Mic (the 3.5 mm input gain) and possibly Auto Gain Control. Use F4 to switch to capture view, arrow keys to adjust.

Mic level vs line level

The 3.5 mm mic input is mic level only. Plugging in a line-level source (mixer output, audio interface output) will distort heavily. To attenuate, use a pad like the Sescom MX-LAU-25 or a Whirlwind PCDI, then a TRS-to-TRS cable.

PulseAudio / PipeWire

Most modern desktop distros run PipeWire as a PulseAudio-compatible replacement. The Pengo shows up in the system audio settings automatically.

pavucontrol / pw-cli

# Find the sink / source name
pactl list short sources | grep -i pengo

You should see something like:

2   alsa_input.usb-Pengo_Pengo_HDMI_Grabber-02.analog-stereo    ...

Use that name in any PulseAudio app:

# Record 5 seconds to a WAV file
parec --device=alsa_input.usb-Pengo_Pengo_HDMI_Grabber-02.analog-stereo \
      --file-format=wav /tmp/capture.wav &
sleep 5
kill %1

In GNOME Settings → Sound, the Pengo appears as an input device under the Choose a sound input dropdown. Same in KDE Plasma's audio settings.

PipeWire wpctl

# List audio devices
wpctl status

# Set the Pengo as the default source for the session
wpctl set-default <id>

wpctl inspect <id> shows the full path; look for the node.name that contains "Pengo".

Routing the headphone output

The 3.5 mm headphone jack is an output — the kernel surfaces it as a sink. With something plugged in:

pactl list short sinks | grep -i pengo

To make a desktop application play audio through the Pengo's headphone jack, set the Pengo sink as the default in your sound settings, or:

pactl set-default-sink alsa_output.usb-Pengo_Pengo_HDMI_Grabber-02.analog-stereo

Why use the headphone output at all?

It's a hardware-monitored mirror of the active stream. Useful for plugging in zero-latency headphones during a live shoot where you want to hear the captured audio directly without going through the host's audio stack.

Latency and clock drift

USB audio devices are notorious for small clock drifts. If your recordings show A/V sync drift over long captures:

  • Use -use_wallclock_as_timestamps 1 in FFmpeg to anchor audio frames to the wall clock
  • Or use a constant bitrate capture profile
  • PipeWire handles drift better than raw ALSA for most workloads

Next: AI Agent Integration →