EBU R128 loudness normalization, and why it is cached

Music from twenty different sources arrives at twenty different levels. Loudness normalization fixes that properly — measured to broadcast standard, not guessed from peak level.

Pull a hundred tracks from a hundred different releases and they will not sit at the same level. A 1980s master and a modern loudness-war remaster can differ by more than 10 dB. Left alone, your listeners reach for the volume knob every few songs.

Peak normalization does not fix this, because peak level tells you almost nothing about perceived loudness. A heavily compressed track and a dynamic one can share the same peak and sound completely different.

Measuring the way broadcasters do

PlayOnRadio measures integrated loudness following the ITU-R BS.1770 and EBU Tech 3341 approach. The signal is resampled to 48 kHz stereo, run through a two-stage K-weighting filter — a pre-filter plus an RLB high-pass — then analysed in 400 ms blocks with 75% overlap.

Two gates follow: an absolute gate at -70 LUFS to discard silence, then a relative gate 10 LU below the ungated measurement, so quiet passages do not drag the result down. What comes out is integrated LUFS, the number that actually corresponds to how loud a track sounds.

Applying the correction

The gain for each track is simply target - integratedLufs, clamped to a sane range of -24 to +12 dB. The default target is -16 LUFS, typical for broadcast and streaming, and configurable in Preferences.

Where that gain is applied matters. It is baked into each deck, before the crossfade fader, rather than into a global output stage. During a crossfade between two tracks with different corrections, each deck keeps its own gain throughout. The outgoing track stays stable while the incoming one arrives correctly levelled — including when one of them is a live stream.

Measured once, not every play

Loudness analysis is not free. Doing it at playout time would be unacceptable, so results are cached to disk, keyed by file path, file size and last-write time. Re-encode or replace a file and the key changes, so the stale measurement is discarded automatically.

You can fill that cache deliberately: Preferences → Broadcast Engine → Analyze all tracks walks the current playlist on a background thread with live progress. A warm-up service also queues missing entries after an import, running at most two analyses at a time so it never competes with playback.

The result is that normalization is instant at play time. The expensive work happened while nobody was waiting.

Related reading

Ready to hear it on your own station?

Tell us about your setup and we'll send you a personalised quote.

Request a Quote