Put a linear dB scale on a meter and something useless happens: everything you care about crowds into the top corner. The range between -20 dB and 0 dB is where broadcast audio lives, and on a linear scale it occupies a fifth of the width.
A scale weighted where you work
PlayOnRadio maps level to position so the top 66% of the meter covers -20 dB to 0 dB, with a floor at -60 dB. The critical range gets two thirds of the space, and a 2 dB change where it matters is a visible movement rather than a pixel.
Scale ticks are drawn at -40, -20, -10, -6 and 0. Crucially, the ticks and the fill gradient are generated from the same mapping, so the numbers always line up with the fill. A meter whose markings disagree with its own bar is worse than no meter.
Peak, not average
The metering is sample-peak, reset-on-read. Each channel latches the loudest sample since the last read and clears when read. A single-sample transient cannot slip between refreshes unnoticed, which is exactly the kind of thing that causes distortion nobody can account for later.
A white peak-hold marker sits at the recent maximum, and a CLIP indicator lights above -3 dBFS. Three decibels of headroom before the warning is deliberate: by the time you are at 0 dBFS, the damage is already in the output.
Two styles
Bars are the default — gradient fills, peak-hold marker, clip LED. Needles are classic rotating gauges for operators who read them faster.
The needle version has a subtlety worth appreciating. The needle angle follows the same non-linear curve printed on the dial face, so a full-scale 0 dBFS signal rests on the dial's "0" rather than swinging into the red. A gauge whose needle disagrees with its own printing trains operators to distrust it.
Fast enough, not wasteful
Updates publish only when a level or peak moves by at least 0.5 dB, capping effective refresh at around 30 FPS. Peak-hold decay stays tied to the real meter timer, so the dead-band saves redraws without making the meter sluggish.
Switch on On-Air Mode and the cadence halves again to 10 Hz, trading meter smoothness for headroom on a machine that is currently on the air. That is the right trade at the right moment.