Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Normalize volume level with PulseAudio

Normalize volume level with PulseAudio and simultaneous output

This should work conceptually on any Linux OS with PulseAudio but these particular instructions are for Ubuntu. There are two major reasons for using simultaneous output. The first is self-evident - we can output to say a bluetooth headset and wired headphones at the same time to enable two people to watch a movie with headphones on a single computer. The second reason is a sort of a convenience for setup. We know the simultaneous sink name so the default.pa config would work without modification so long as simultaneous output is enabled. If we were to set this up without that, we'd have to customize the config with our specific device sink name. That's totally doable but personally I always setup simultaneous output. That's why I haven't described the alternative in this gist.

  1. Install LADSPA plugins containing the compressor and limiter we'll use:
sudo apt install swh-plugins
  1. Install PulseAudio Preferences paprefs:
sudo apt install paprefs
  1. Open PulseAudio Preferences:
paprefs
  1. Go to the Simultaneous Output tab.
  2. Check Add virtual output ... all sound cards and Close.
  3. Copy default.pa from this gist to ~/.config/pulse/.
  4. Restart PulseAudio:
pulseaudio -k

The normalized output is selected by default. If you want to change this behaviour you can comment out or delete the set-default-sink ladspa_normalized line in the ~/.config/pulse/default.pa file. You can also select any other output from the PulseAudio settings when you need unmodified output. This approach can be modified to instead normalize the volume of a particular sound device instead of normalizing the simultaneous virtual device.

Credit

https://askubuntu.com/questions/95716/automatically-adjust-the-volume-based-on-content

.nofail
.include /etc/pulse/default.pa
# Create compressed sink that outpus to the simultaneous output device
load-module module-ladspa-sink sink_name=ladspa_sink master=combined plugin=dyson_compress_1403 label=dysonCompress control=0,1,0.5,0.99
# Create normalized sink that outputs to the compressed sink
load-module module-ladspa-sink sink_name=ladspa_normalized master=ladspa_sink plugin=fast_lookahead_limiter_1913 label=fastLookaheadLimiter control=10,0,0.8
# Comment out the line below to disable setting the normalized output by default:
set-default-sink ladspa_normalized
@dhalucario

This comment has been minimized.

Copy link

@dhalucario dhalucario commented Aug 18, 2020

This is alright but the problem is when you have multiple audio devices (like a HDMI monitor) it just plays it on all.

@galaczi

This comment has been minimized.

Copy link

@galaczi galaczi commented Jan 21, 2021

I was looking for normalization but this actually limited the overall volume to very low so I am not using it.

@lightrush

This comment has been minimized.

Copy link
Owner Author

@lightrush lightrush commented Jan 21, 2021

@galaczi make sure that you increase the volumes of all the chained sinks.

@bricakeld

This comment has been minimized.

Copy link

@bricakeld bricakeld commented May 23, 2021

Is it possible to normalize on just one sink instead of combining into the simultaneous output before normalizing?

@lightrush

This comment has been minimized.

Copy link
Owner Author

@lightrush lightrush commented May 23, 2021

It should be possible. I'm using simultaneous output for various reasons but there's nothing stopping you doing the same but swapping the master of the compressor sink to be the whatever sink you want normalized.

@bricakeld

This comment has been minimized.

Copy link

@bricakeld bricakeld commented May 23, 2021

thanks, that works

@lightrush

This comment has been minimized.

Copy link
Owner Author

@lightrush lightrush commented Jun 29, 2021

I was looking for normalization but this actually limited the overall volume to very low so I am not using it.

You have to ensure that all of the chained sinks have their volumes maxed out. If for example the level of the final sound card is low, even if the combined, limiter and compressor are high, the final output would be low. The audio chain goes like limiter > compressor > simultaneous output > sound card(s). It's setup so that the default output is set to the limiter. When you control your system's volume, you control the limiter's volume. If some sink downstream from it has its volume level lowered, the whole chain's level will be lower. Note that if you're utilizing simultaneous output and want different final volume on different sound cards, you can select each sound card individually, adjust its level, then select the limiter again as the output.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment