MY WEBCAM TEST GUIDE

How to Add an Equalizer to PipeWire Audio

A practical guide to adding a system equalizer to PipeWire using the built-in filter chain, with options for graphic and parametric EQ and checks for common problems.

PipeWire does not ship a graphical equalizer app of its own, but it can run an equalizer as a local filter chain between applications and the output device. This approach affects audio on the current machine only and does not require a separate service or subscription. The result is a system-wide EQ that works for media players, browsers and most call or video applications using normal playback paths.

Before you start

You need a working PipeWire session with the standard session manager and a configuration directory, usually found under the user's config folder. The equalizer uses the built-in filter-chain module, so no extra plugin package is required. Changes apply locally to the current user account. Keep the original configuration file available so the change can be reverted.

Check the installed PipeWire version before editing. Newer releases support a configuration fragment that enables the filter chain; some older setups expect the filter to be defined inside the main PipeWire configuration. The version number also affects whether separate configuration snippets are loaded automatically.

Step-by-step instructions

First, copy the distributed PipeWire configuration example for your user profile if a matching local file is not already present. A user configuration overrides the system version and is easier to restore. Use only the example intended for your installed branch.

Open the user configuration in a plain text editor and locate the section that loads modules. Add one filter-chain entry that describes the equalizer. The exact placement can vary by distribution, so follow the ordering already used in the file and do not duplicate an existing filter entry.

context.modules = [
  {
    name = libpipewire-module-filter-chain
    args = {
      node.description = "Equalizer"
      media.name = "Equalizer"
      filter.graph = {
        nodes = [
          {
            type = builtin
            name = eq_band_1
            label = biquads
            control = { "Freq" = 100 "Q" = 1.0 "Gain" = 0.0 }
          }
          {
            type = builtin
            name = eq_band_2
            label = biquads
            control = { "Freq" = 1000 "Q" = 1.0 "Gain" = 0.0 }
          }
          {
            type = builtin
            name = eq_band_3
            label = biquads
            control = { "Freq" = 8000 "Q" = 1.0 "Gain" = 0.0 }
          }
        ]
        links = [
          { output = "eq_band_1:Out" input = "eq_band_2:In" }
          { output = "eq_band_2:Out" input = "eq_band_3:In" }
        ]
        inputs = [ "eq_band_1:In" ]
        outputs = [ "eq_band_3:Out" ]
      }
      capture.props = {
        node.name = "effect_input.eq"
        media.class = "Audio/Sink"
        audio.position = [ FL FR ]
      }
      playback.props = {
        node.name = "effect_output.eq"
        audio.position = [ FL FR ]
      }
    }
  }
]

This is a minimal three-band example. The Gain values are in dB, Freq is in Hz, and Q controls the width of each band. Start with all gains at zero so the filter is neutral, then change one band at a time after confirming that the chain runs.

After saving the file, restart PipeWire for the user session. On many systems this is done with a user service restart command rather than a full reboot. If a local configuration wrapper is used, restart PipeWire through that wrapper so the changed file is read.

Check the output

Open an application that plays audio and look at the available playback devices in your desktop audio settings or volume control. A virtual sink named Equalizer should appear alongside the physical output device. Select it as the default output or route the test application to it.

Play a track with clearly separated low, mid and high content. Adjust one band at a time and listen for the expected change. Keep the Q moderate at first, because a very narrow band can be hard to judge through small speakers or a noisy environment.

The filter does not alter the sample rate of the stream by design. Playback continues through the existing output device and its normal resampling rules apply. If the virtual sink is selected but no sound is heard, check the routing between Equalizer and the physical output in the session manager.

Common problems and next steps

If the virtual sink does not appear after a restart, inspect the PipeWire log for a syntax error in the module arguments. A missing brace, wrong property name or invalid node label can prevent the whole configuration from loading. The log normally identifies the failing line or module.

Some applications connect directly to a hardware device or to a monitor endpoint instead of the configured default. In that case, route the application manually to Equalizer using the session manager. This is behavior of the application or its audio stack, not a fault in the filter chain.

An overly large positive gain can cause audible distortion or make the output clip. Reduce the highest boosted band and lower the master volume if necessary. For voice calls and video conferencing, begin with small cuts to troublesome frequencies rather than large boosts, because background noise becomes more noticeable when the input level or playback gain in that range is raised.

If you only want to shape microphone audio, apply the equalizer to the input device path instead of the playback sink. The same filter-chain concept can be inserted in the capture direction, but it should be created as a virtual source and selected as the input device in the calling or recording application.

To make the EQ easier to adjust, check whether your desktop environment includes an equalizer interface that works with PipeWire. Some distributions provide a dedicated utility that manages the filter chain and applies changes without editing the configuration by hand. If that tool exists for your version, it is usually the safer way to experiment with band settings.