Skip to content

VibeServer 3.1.7 — the audio dropout, IMS working, and admin per listener

Latest

Choose a tag to compare

@Stuey3D Stuey3D released this 15 Aug 15:36
· 11 commits to main since this release

Everything from 15 August, rolled onto macOS. The Linux/Pi package has been on
each of these since they landed; this brings the Mac app level.

The audio dropouts, and IMS working for the first time

AdaptiveIf::setBandwidth had no early-out, and the shadow receiver — the
parallel copy that measures whether narrowing the IF would help — is told its
bandwidth on every evaluation, about fifteen times a second, forever. Each
call designed a fresh windowed-sinc filter and heap-allocated it on the DSP
thread
.

The allocation was the lesser half: replacing the filter throws away its
history, so every shadow measurement was taken on a filter that had just been
reset — measuring its own start-up transient. That reading steers the narrowing
decision, and it read so badly that IMS could not engage at all, on any
receiver, since the feature shipped
.

With an honest shadow it engages, and it was measured from an on-air A/B
recording: about 6 dB more usable signal — mono hiss 8–14 kHz falling from
−8.0 to −13.8 dB against programme level. The panel had predicted 3.8–5 dB from
an entirely independent measurement of the MPX guard band, which is the strongest
evidence available that the instrument is honest again.

A retune now returns the IF to wide. The engage rule needs 3 dB in either
direction so it cannot chatter, which makes both states stable — so a narrowing
earned on one station was carried into the next, and a strong local kept a filter
it never needed.

The SNR readout

The noise floor is the average of the band edges, and a strong station near the
edge of the span WAS the floor: it rose to meet the signal and the reading went
to zero on a station plainly out of the noise. Now the 25th percentile of the
edge bins, which does not care that part of the window is occupied.

Whose settings are whose

  • NR, IMS, CEQ and the noise blanker are PER LISTENER. They were server-wide:
    one listener's toggle looped over every connected client's pipeline and changed
    what all of them heard. They touch nobody's front end, so the admin gate went
    with the broadcast. It matters on a shared receiver — an SDRplay on FM with
    several listeners — which is also the only configuration where they were
    previously admin-gated, so the people who most needed them could not reach them.
  • ADMIN IS PER LISTENER. One atomic served the whole process while its own
    comment described it as "per connected client", so two owners shared one bit —
    and a stranger arriving counted as a new occupant, which CLEARED it, demoting an
    admin who was listening quietly. The countdown's exemption and the idle re-lock
    follow the listener now too.
  • The gain follows the radio. hwinfo carries the current gain, so a connecting
    client shows what the radio is set to instead of imposing its own remembered
    value — which silently overrode the owner's resting gain and re-gained a shared
    receiver under everyone already on it.

Also

  • The iOS auto-zoom threshold: the landing page's inputs were 15px, one pixel
    under the 16px at which Safari zooms the page in and never back out.
  • The Mac app's version is read from the build rather than typed into the
    packaging script, so the bundle cannot disagree with the server inside it.

Install

macOS — download, unzip, drag to Applications. Signed, notarised and
stapled, so it opens without a Gatekeeper warning.

Raspberry Pi / Debiansudo apt update && sudo apt install --only-upgrade vibeserver