VibeServer for macOS — v0.4.2 Alpha (SDRplay freeze fixed, FM-DX mode, RAW RDS)
Pre-releaseThe headline is a bug fix: an SDRplay RSP could freeze solid — audio and spectrum stopped
dead while the server went on reporting itself perfectly healthy, and only quitting and
relaunching VibeServer brought it back.
The freeze
The SDRplay API can simply stop calling the stream callback while every handle stays valid and
every call still returns success. Nothing was watching for it.
The embarrassing part: the silence watchdog already existed, and the SDRplay path already
timestamped every buffer it received. But the watchdog was only ever started on the RTL-SDR
path, so on an RSP nothing ever read the timestamp. One missing call, in the one place it
mattered most — which is exactly why the server kept insisting it was fine.
It now detects the stall and re-initialises the stream in place, keeping your gain, AGC and
tuning. You lose a second of audio instead of the session. If the API is genuinely wedged rather
than stalled it stops after a few attempts and says so, instead of hammering it.
FM-DX — a new mode, next to WFM ⚠️ WITHDRAWN, DO NOT USE
Correction, added after release. FM-DX is in this build and it makes RDS worse. It is
removed in 0.5. If you are running 0.4.2, stay in WFM.The reasoning below was justified by a simulation that measured the wrong quantity: how much
RDS subcarrier amplitude survives the channel filter. What decides whether RDS decodes is
subcarrier signal-to-noise, and FM's noise triangle puts noise power up as the square of
baseband frequency — so a wider filter dumps disproportionately more noise at exactly 57 kHz.
The numerator was measured and the denominator ignored.Measured properly afterwards, RDS SNR at 57 kHz:
channel filter RTL-SDR @ 2.4 MSPS Airspy HF+ @ 768 kHz standard (WFM) +32.9 dB +36.5 dB wide (FM-DX) +33.1 dB +26.5 dB Roughly neutral on a dongle, which is why it passed testing — and ten dB worse on a
narrow-band radio. It showed up within minutes of an Airspy HF+ being plugged in: on a strong
local, constellation scatter went 16% → 39% and block sync was lost entirely, on a station
plain WFM decodes instantly.One further correction. 0.4.1's notes said the channel filter meant we were "receiving RDS
weak and losing decode margin". That was inferred from the same amplitude figure and is not
true. The subcarrier amplitude really is attenuated — which is why our deviation reads lower
than a Pira analyser — but the SNR is fine, and is in fact best at the standard setting. The
filter costs readout accuracy, not decodability.
The original text follows, for the record.
The FM channel filter clips the outer sidebands, and because those carry the top of the MPX,
it costs the RDS subcarrier 1.9 dB of amplitude while leaving the 19 kHz pilot untouched. That
asymmetry is what HansVanEijsden's Pira analyser saw from the other end in 0.4.1.
Widening the filter recovers that amplitude — at the cost of audio quality near the threshold:
| channel | RDS amplitude | audio SNR |
|---|---|---|
| standard | −1.86 dB | +11.7 dB |
| a little wider | −0.85 dB | +11.1 dB |
| FM-DX | −0.27 dB | +9.7 dB |
Selecting FM-DX opens the RDS analyser. Closing the analyser drops back to WFM. It costs about
45% more CPU per listener than FM with RDS.
RAW mode in the RDS analyser
A new RAW button. Normally every gated field is confirmed by repetition, so one
mis-corrected block cannot poison it. RAW shows what is arriving live instead: labels start red
and turn green as each field earns confirmation, so you watch the panel resolve.
It earns its place on marginal signals. A station whose RDS locks and drops looks broken in
confirmed mode — fields simply never appear, with no explanation. In RAW it becomes a visible
"arriving but not surviving", which is the difference between "this software can't decode it"
and "this signal is marginal, and here is the evidence".
It is entirely a client-side view. The server always sends both, so switching to RAW cannot
affect anyone else listening to the same receiver.
More things that were reporting confidently and wrongly
- TA, MS and DI are now confirmed by repetition, like PTY and TP. DI is four single bits
spread across four groups, so one bad group could set a flag for the whole session. - RDS deviation was measuring noise. The subcarrier band is never empty, so with no station
the estimator turned hiss into "12.9 kHz · generous" — past the 5.6 kHz spec ceiling, and it
read higher as the signal got worse. It now reports nothing without block sync, subtracts
a measured noise floor in FM-DX, and flags anything past spec as suspect rather than good. - RSP1B gain survives a restart. It was being lost inside the server, not by the client.
Also
- "Use this Mac's location" in Settings. It fills in the Maidenhead locator, not your
coordinates — a square a few km across, which is all a distance or bearing needs. - A receiver name, shown with the location over the spectrum.
- The station logo, large, under the MPX display.
- The RDS panel no longer stair-steps as fields arrive — the plots column could wrap.
Requires macOS 14. Notarised, so it opens without a Gatekeeper warning. RTL-SDR and SDRplay
RSP.