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.
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.
Setting up a mic chain¶
- Launch EasyEffects
- Switch to the Source tab (for microphone inputs)
- Select your microphone from the dropdown
- Click + to add effects in order:
Recommended chain for voice/podcast:
| 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.
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)¶
- Click Mixxx — anonradio in the app menu
- When asked about your music library, point it at
~/Musicor~/Nextcloud/Music - Set your audio interface: Preferences → Sound Hardware
- Master output → your speakers/headphones
- 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)¶
- In Mixxx: Preferences → Live Broadcasting
- Enable: ✓
- Settings:
- Type: Icecast 2
- Host:
anonradio.net(or your Icecast server) - Port:
8000(or as given by anonradio) - Mount:
/your-mount-point - Username / Password: your anonradio credentials (from Bitwarden)
- Click Connect in the main Mixxx toolbar (broadcast icon)
- Green dot = connected and streaming
Recording a set (for HPR)¶
- Preferences → Recording — set output directory and format (MP3 or FLAC)
- Click the record button in the toolbar
- 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).
Common workflow: record and trim an intro/outro¶
- Preferences → Devices → select your microphone (or EasyEffects virtual device)
- Press Record (R) — speak
- Press Stop (Space)
- Select a section with the mouse →
Deleteto remove it - Effect → Noise Reduction → get a noise profile from a silent section, then apply to the whole track
- 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.
Session setup¶
- New Session → set name, directory, sample rate (44100 for podcast, 48000 for video)
- Choose a template or start empty
- Track → Add Track/Bus → Audio Track → Mono (for voice) or Stereo (for music)
Basic recording¶
- Select a track → click the Arm button (red circle on the track)
- Press Record in the transport bar, then Play
- 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)
First-time setup¶
- Auto-Configuration Wizard on first launch — choose Streaming or Recording
- For streaming: enter your Icecast/RTMP server address and stream key
- 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¶
- Set up stream settings: Settings → Stream → Service = Custom, then enter your Icecast/RTMP URL and stream key
- 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.