Skip to content

Lesson 16 — Audio Production & Streaming

The full chain from microphone to live stream or finished recording. Your setup is built around two use cases: live DJ streaming to anonradio and HPR show production. Source: vendor/nixproject/modules/home/streaming.nix.


The Signal Chain

Understanding how audio flows through the system is the key to getting everything working:

Microphone
  └── Hardware input (PipeWire)
        └── EasyEffects (noise reduction, gate, EQ, compressor)
              └── Processed mic output (virtual PipeWire sink)
                    ├── OBS (for recording/streaming) 
                    └── Zoom/Teams (for calls)

Mixxx (music playback)
  └── Main deck output (PipeWire)
        ├── Your headphones/speakers (monitoring)
        └── OBS PipeWire capture (for streaming the music)

OBS
  └── Takes: processed mic + Mixxx audio + optional screen capture
        ├── Records to file (local recordings)
        └── Streams to Icecast / anonradio / YouTube RTMP

PipeWire is the backbone — it routes audio between apps. qpwgraph is your visual tool for seeing and changing those connections.


pavucontrol — volume and device selection

Start here. Before anything else, make sure audio is routing to the right places.

pavucontrol            # or launch from app menu

The tabs

Tab What it controls
Playback Volume per app currently playing audio
Recording Which input device each app is recording from
Output Devices Your physical speakers/headphones
Input Devices Your physical microphones
Configuration Sound card profiles

Setting up per-app routing

In the Recording tab, you can see each app that's recording audio and change which input it uses. This is how you point Zoom at the EasyEffects-processed mic instead of the raw microphone.

In the Playback tab, you can route Mixxx's output to specific devices — useful if you have headphones for monitoring and speakers for the room.


EasyEffects — mic processing chain

EasyEffects sits between your physical microphone and the rest of the system, applying real-time processing.

easyeffects            # or launch from app menu

Setting up a mic chain

  1. Launch EasyEffects
  2. Switch to the Source tab (for microphone inputs)
  3. Select your microphone from the dropdown
  4. Click + to add effects in order:

Recommended chain for voice/podcast:

Gate → Noise Reduction → Equalizer → Compressor → Limiter

Effect What it does Typical setting
Gate Silences input below a threshold (cuts background noise when you're not talking) Threshold: -40 to -50 dB
Noise Reduction RNNoise plugin — AI-based noise removal Enable, default settings
Equalizer Shape the frequency response of your voice High-pass at ~80 Hz (cut rumble), gentle boost at 2-4 kHz (presence)
Compressor Evens out volume differences (quiet parts louder, peaks controlled) Ratio 4:1, attack 10ms, release 100ms
Limiter Hard ceiling to prevent clipping Threshold: -1 dB

The virtual device

Once EasyEffects is running and processing, it creates a virtual device. In pavucontrol or your video call app's audio settings, look for a device with easyeffects in the name — select that as your microphone input to get the processed audio.

EasyEffects needs to be running for the virtual device to exist. You can set it to autostart: Settings → General → Start at Login.


qpwgraph — PipeWire patchbay

qpwgraph is a visual representation of all audio (and video) connections in PipeWire. Use it to see what's connected to what, and to make or break connections manually.

qpwgraph               # or launch from app menu

The interface

Each box is a node (an app or device). The circles on the edges are ports. Lines between ports are connections.

  • Left side of a node = inputs
  • Right side of a node = outputs
  • Drag from an output port to an input port to connect them
  • Right-click a connection → Disconnect to remove it

Common things to wire up

Route Mixxx main output to OBS: 1. Find the Mixxx node — drag its output to the OBS node's input 2. Now OBS captures Mixxx's audio as a separate source

Route processed mic to OBS: 1. Find the EasyEffects output node 2. Drag to OBS's microphone input

Monitor mix (hear what's going out): 1. Route Mixxx output to your headphones 2. Route OBS master output to headphones for a full mix monitor

Saving connections

PipeWire connections are session-based by default — they reset when apps restart. To make them persistent, use pw-link in a startup script or configure through Home Manager's PipeWire session settings.


Mixxx — DJ and live streaming

Mixxx is your DJ software, used for both anonradio live streaming and HPR show preparation. Your config creates two separate profiles (anonradio and HPR) and a sync wrapper that keeps them synced to Nextcloud.

Always launch Mixxx via the synced launchers in your app menu: - Mixxx — anonradio → for live shows - Mixxx — HPR → for show prep and recording

These run mixxx-synced, which syncs your profile to/from Nextcloud before opening and after closing.

First launch (per profile)

  1. Click Mixxx — anonradio in the app menu
  2. When asked about your music library, point it at ~/Music or ~/Nextcloud/Music
  3. Set your audio interface: Preferences → Sound Hardware
  4. Master output → your speakers/headphones
  5. Headphone output → second output if you have a DJ interface

The Mixxx interface

Left deck    Centre controls    Right deck
[Waveform]   [Crossfader]       [Waveform]
[BPM/Key]    [FX sends]         [BPM/Key]

Loading tracks: - Drag from the library at the bottom to a deck - Or double-click a track in the library to load to the next free deck

Basic mixing: - Crossfader — blend between decks - Play buttons — start/stop each deck - Sync button — sync BPM between decks automatically - Headphone button (cue) — pre-listen in headphones before bringing in

Live streaming to anonradio (Icecast)

  1. In Mixxx: Preferences → Live Broadcasting
  2. Enable: ✓
  3. Settings:
  4. Type: Icecast 2
  5. Host: anonradio.net (or your Icecast server)
  6. Port: 8000 (or as given by anonradio)
  7. Mount: /your-mount-point
  8. Username / Password: your anonradio credentials (from Bitwarden)
  9. Click Connect in the main Mixxx toolbar (broadcast icon)
  10. Green dot = connected and streaming

Recording a set (for HPR)

  1. Preferences → Recording — set output directory and format (MP3 or FLAC)
  2. Click the record button in the toolbar
  3. When done, click stop — file is in your chosen directory

Audacity — recording and editing

Audacity is for quick recording, trimming, and cleanup — not full production (that's Ardour).

audacity               # or app menu

Common workflow: record and trim an intro/outro

  1. Preferences → Devices → select your microphone (or EasyEffects virtual device)
  2. Press Record (R) — speak
  3. Press Stop (Space)
  4. Select a section with the mouse → Delete to remove it
  5. Effect → Noise Reduction → get a noise profile from a silent section, then apply to the whole track
  6. File → Export → Export as MP3 → save

Useful effects

Effect When to use
Noise Reduction Remove background hiss from a recording
Normalize Bring volume to a consistent level
Compressor Even out dynamic range
Trim silence Effect → Special → Truncate Silence
Fade In/Out Select the start/end → Effect → Fading → Fade In/Out

Ardour — full multitrack DAW

Ardour is for show production when you need multiple tracks, precise editing, and a proper mix. More complex than Audacity — use it when Audacity isn't enough.

ardour6                # or app menu (version may vary)

Session setup

  1. New Session → set name, directory, sample rate (44100 for podcast, 48000 for video)
  2. Choose a template or start empty
  3. Track → Add Track/Bus → Audio Track → Mono (for voice) or Stereo (for music)

Basic recording

  1. Select a track → click the Arm button (red circle on the track)
  2. Press Record in the transport bar, then Play
  3. Press Stop when done

Editing

  • Pointer tool (P) — select, move regions
  • Range tool (R) — select time ranges to cut or copy
  • Snap — right-click the grid icon to set snap (bars, beats, seconds)
  • Split a region: position cursor → S
  • Delete: select → Delete

Exporting

Session → Export → Export to Audio File(s): - Set range: session start to end - Format: MP3 (for podcast) or WAV/FLAC (for archival) - Output: your chosen directory


OBS — recording and streaming compositor

OBS ties everything together — it can record locally, stream to Icecast/RTMP, and gives you scene switching for more polished shows.

Your config installs OBS with: - wlrobs — Wayland screen capture - obs-pipewire-audio-capture — capture per-app audio (e.g. just Mixxx, not everything)

obs                    # or app menu

First-time setup

  1. Auto-Configuration Wizard on first launch — choose Streaming or Recording
  2. For streaming: enter your Icecast/RTMP server address and stream key
  3. For recording: set output directory and format (MKV is safest — recoverable if OBS crashes)

Scenes and sources

Scenes are presets (e.g. "Live DJ set", "Podcast recording", "Screen share"). Sources are the inputs in a scene.

Add a source: 1. In the Sources panel → + 2. Common types: - Screen Capture (PipeWire) — Wayland screen capture (uses wlrobs) - Audio Input Capture (PipeWire) — capture a specific app's audio - Audio Output Capture — capture system audio - Image — logos, overlays

Audio mixer

The Audio Mixer panel shows all audio sources. Each has a level meter and volume fader. For a DJ stream you typically want: - Mixxx main output → one channel - Your microphone (via EasyEffects) → another channel - Mix them in OBS's mixer

Streaming

  1. Set up stream settings: Settings → Stream → Service = Custom, then enter your Icecast/RTMP URL and stream key
  2. Press Start Streaming in the main window

Recording

Press Start Recording — OBS records to the directory set in Settings → Output → Recording.


ffmpeg — convert and process audio

ffmpeg is a command-line tool for converting, encoding, and processing audio and video.

# Convert audio formats
ffmpeg -i input.wav output.mp3
ffmpeg -i input.flac -q:a 2 output.mp3   # high quality MP3

# Normalize audio volume
ffmpeg -i input.mp3 -filter:a loudnorm output.mp3

# Trim: from 00:01:30 to 00:05:00
ffmpeg -i input.mp3 -ss 00:01:30 -to 00:05:00 output.mp3

# Extract audio from a video
ffmpeg -i video.mp4 -vn audio.mp3

# Join multiple files
ffmpeg -f concat -safe 0 -i filelist.txt -c copy output.mp3
# filelist.txt format:
# file 'part1.mp3'
# file 'part2.mp3'

# Check file info (no output — just shows metadata)
ffprobe input.mp3

ffmpeg is mostly used in scripts or as a post-processing step. tldr ffmpeg gives a quick reference.