I use an Elgato Wave:3 microphone. On nixos, the microphone itself worked immediately through PipeWire, but only as a raw input.

That means:

Wave:3 → application

No noise reduction, no EQ, no compression, and obviously no Elgato Wave Link application on Linux.

What I wanted was a small replacement for the useful MicrophoneFX part of Wave Link:

Wave:3
  ↓
processing
  ↓
virtual microphone
  ↓
OBS / browser / other apps

EasyEffects does this surprisingly well.

NixOS PipeWire setup

My configuration.nix already had PipeWire enabled:

# Enable sound with PipeWire.
services.pulseaudio.enable = false;
security.rtkit.enable = true;
 
services.pipewire = {
  enable = true;
  alsa.enable = true;
  alsa.support32Bit = true;
  pulse.enable = true;
 
  # If you want to use JACK applications, uncomment this
  # jack.enable = true;
 
  # Use the WirePlumber session manager
  # wireplumber.enable = true;
};

One thing confused me here initially.

wireplumber.enable is commented out, but that does not mean WirePlumber is not running.

Checking the actual service:

systemctl --user status wireplumber

showed that WirePlumber was already active.

So there was no reason to explicitly enable or disable anything. The existing PipeWire stack was already working correctly.

Add EasyEffects and QPWGraph

In my packages.nix:

{
  environment.systemPackages = with pkgs; [
 
    # media
    # Wave:3 microphone processing and PipeWire routing inspection
    easyeffects
    qpwgraph
    obs-studio-nvenc
    vlc
 
  ];
}

Then rebuild:

sudo nixos-rebuild switch

Build the microphone FX chain

Open EasyEffects → Input and add the effects there.

I started with:

Noise Reduction
↓
Compressor
↓
Limiter

Then expanded it to:

Wave:3
  ↓
High-pass Filter
  ↓
Noise Reduction
  ↓
Equalizer
  ↓
Compressor
  ↓
De-esser
  ↓
Limiter

I found it better to start small and add effects one by one instead of creating a huge chain immediately.

The Wave:3 already sounds decent, so the point is cleanup rather than turning it into some overprocessed radio voice.

Use the virtual microphone

EasyEffects exposes the processed input as:

Easy Effects Source

So applications now have two choices:

Elgato Wave:3
    raw microphone

Easy Effects Source
    processed microphone

For OBS, browsers, calls, recording, etc., I simply select Easy Effects Source.

That gives me basically what I wanted:

flowchart TB
    A["🎙️ Elgato Wave:3"]
    B["🔊 PipeWire"]
    C["🧭 WirePlumber"]
    D["🎛️ EasyEffects"]

    A --> B --> C --> D

    D --> E["✨ Processing Chain<br/>High-pass filter<br/>Noise reduction<br/>Equalizer<br/>Compressor<br/>De-esser<br/>Limiter"]

    E --> F["🎤 EasyEffects Source"]

    F --> G["🎥 OBS"]
    F --> H["🌐 Browser"]
    F --> I["🖥️ +Others"]

QPWGraph is also useful if I want to actually see how PipeWire has connected everything instead of guessing.

Useful checks

wpctl status -n

and:

systemctl --user is-active pipewire pipewire-pulse wireplumber

On my setup all three services are active.

The important discovery for me was that the lack of Wave Link on Linux does not make the Wave:3 a raw-only microphone. PipeWire already provides the routing, and EasyEffects fills in the processing part with very little effort.

I have documented another longer version covering Fedora, Ubuntu/Linux Mint/Zorin, CachyOS, and NixOS.