LiveAudioServer v0.1.2
This release adds audible "dead-air" filler for live UDP / TCP feeds. When the upstream source (Gqrx, an SDR daemon, a remote producer, etc.) stops sending packets, listeners can now hear a configurable sine wave instead of dead silence, until the input resumes.
What's new
Sine-tone filler (opt-in)
Two new flags let you replace the silence-fill window with an audible test tone:
.build/release/LiveAudioServer \
--udp-input-port 7355 \
--filler-mode tone \
--filler-tone-hz 1000 \
--keep-alive--filler-mode {silence|tone}— defaultsilencekeeps the historical behavior (zero PCM, optionally TPDF-dithered via--silence-dither). Set totoneto emit a continuous sine wave at -20 dBFS.--filler-tone-hz <hz>— tone frequency (default 1000 Hz, the broadcast reference). Below the Nyquist frequency of the configured sample rate.- The sine generator carries phase across chunks, so there are no audible clicks at chunk boundaries.
UDP and TCP gap detection (new behavior)
Previously the filler only triggered on stdin EOF + --keep-alive. v0.1.2 adds the same logic to live UDP and TCP inputs:
- The UDP/TCP recv loops now use
SO_RCVTIMEOat chunk-period cadence. - After
--filler-after-ms(default 500 ms) of consecutive packet absence, the reader switches to emitting filler chunks at the audio sample rate so HTTP listeners stay connected and encoders keep running. - When real packets resume, filler ends immediately and stale pre-gap data is discarded to avoid a time-warp on resume.
- Brief network jitter (under the threshold) passes through unaltered.
Refined Gqrx UDP example in the README
The Gqrx + RTL-SDR walk-through has been rewritten to match the actual current best practice:
- LiveAudioServer reads Gqrx's UDP output directly — no more
ffmpegpassthrough. - Adds HTTP Basic auth (
--auth-user/--auth-password),--silence-dither, and--keep-alivefor robustness. - Includes an
--auth-password-envfollow-up so credentials don't leak viaps/ shell history. - Notes the iPhone Safari credential dialog (saved to the iCloud Keychain after first use).
- New step-by-step Gqrx UI walk-through (Audio → UDP button → host
localhost, port7355, Stereo ✓).
Backwards compatibility
- Defaults unchanged. Running v0.1.2 with the same flags as v0.1.1 produces the same output. The filler is opt-in via
--filler-mode tone. - UDP/TCP gap detection runs in silence mode too, but only emits zero bytes (the same as
--silence-dither's dithered silence when paired). The visible effect: encoders see a continuous stream during input gaps instead of stalling.
Install
Pre-built (recommended for non-developers)
- Download
LiveAudioServer-v0.1.2-macos-universal.zipbelow. - Double-click to unzip.
- Open
READ-ME-FIRST.txtand follow the one-time first-launch steps.
From source
git clone https://github.com/dsward2/LiveAudioServer.git
cd LiveAudioServer
swift build -c release
Homebrew tap
brew install dsward2/tap/liveaudioserver
(Update the tap's formula url to v0.1.2 and recompute the source-tarball sha256 before publishing.)
Checksums
LiveAudioServer-v0.1.2-macos-universal.zip— SHA256:c5b000fd7965742bab0ea33276b310ce373b1709f5730ef209bdef8f53ccfd2c