@@ -326,6 +326,20 @@ Options:
326326 treating the stream as dead.
327327 --silence-dither-ms <n> Milliseconds of pure-silence before dither kicks
328328 in (default: 500).
329+ --filler-mode <mode> What to broadcast during the keep-alive
330+ silence-fill window after stdin EOF.
331+ "silence" (default) emits digital zero
332+ (optionally TPDF-dithered via --silence-dither).
333+ "tone" emits a continuous sine wave at
334+ --filler-tone-hz so listeners hear an audible
335+ "dead-air" placeholder. Only effective with
336+ --keep-alive.
337+ --filler-tone-hz <hz> Frequency of the sine-tone filler in Hz
338+ (default: 1000). Ignored unless --filler-mode tone.
339+ --filler-after-ms <n> Milliseconds of consecutive UDP/TCP input absence
340+ before the filler kicks in (default: 500). Brief
341+ network jitter passes through unaltered; longer
342+ gaps switch to filler.
329343 -V, --verbose Verbose logging
330344 -v, --version Print version string and exit
331345 -h, --help Show this help
@@ -381,13 +395,42 @@ ffmpeg -f avfoundation -i "VB-Cable" \
381395
382396### Gqrx UDP audio feed
383397
398+ ** Configure Gqrx first.** In Gqrx, click the ** UDP** button in the * Audio*
399+ section. In * Audio Options → Network* , set ** UDP host** to ` localhost ` ,
400+ ** UDP port** to ` 7355 ` , and tick the ** Stereo** checkbox. (Gqrx will start
401+ streaming as soon as LiveAudioServer is listening on that port.)
402+
403+ Then start LiveAudioServer:
404+
384405``` bash
385- # Gqrx commonly sends 16-bit stereo PCM to UDP port 7355.
386- # This example assumes Gqrx UDP output is configured for 2-channel stereo.
387- ffmpeg -f s16le -ar 48000 -ac 2 -i " udp://localhost:7355?listen" \
388- -f s16le -ar 48000 -ac 2 - \
389- | .build/release/LiveAudioServer --rate 48000 --channels 2
390- ```
406+ # Gqrx sends 48 kHz 16-bit stereo PCM to UDP port 7355 by default — read it
407+ # directly without any external resampler. Basic-auth gates the HTTP routes,
408+ # --silence-dither keeps downstream tools alive between transmissions, and
409+ # --keep-alive holds the stream open across gaps in the upstream feed.
410+ .build/release/LiveAudioServer \
411+ --udp-input-port 7355 \
412+ --auth-user alice \
413+ --auth-password s3cret \
414+ --silence-dither \
415+ --keep-alive
416+ ```
417+
418+ A few notes about this example:
419+
420+ - ** Don't put the password on the command line in production** — it shows up
421+ in ` ps ` output and shell history. Use ` --auth-password-env ` instead:
422+ ``` bash
423+ export LIVEAUDIO_AUTH_PW=s3cret
424+ .build/release/LiveAudioServer --udp-input-port 7355 \
425+ --auth-user alice --auth-password-env LIVEAUDIO_AUTH_PW \
426+ --silence-dither --keep-alive
427+ ```
428+ - Basic auth gates ** every** HTTP route, including the status page at ` / ` .
429+ The first time you open ` http://<mac>.local:8080/ ` on iPhone Safari you'll
430+ see a credential dialog — enter ` alice ` / ` s3cret ` (Safari can remember
431+ them in the keychain).
432+ - For anything beyond loopback, pair Basic auth with ` --tls-port ` so
433+ credentials don't ride in plaintext on the LAN (see "Native HTTPS" below).
391434
392435### RTL-SDR via ` rtl_fm ` (mono)
393436
@@ -746,7 +789,7 @@ paths and version. `path=/` is the conventional Safari Bonjour-bookmark key;
746789` status=/ ` is the same path under an explicit name for non-Safari clients:
747790
748791```
749- ver=0.1.1
792+ ver=0.1.2
750793path=/
751794status=/
752795mp3=/stream.mp3
@@ -759,7 +802,7 @@ details, so a LiveAudioServer-aware client can enumerate all streams in a
759802single Bonjour lookup without hitting ` /status.json ` :
760803
761804```
762- ver=0.1.1
805+ ver=0.1.2
763806path=/
764807status=/
765808rate=48000
@@ -823,6 +866,9 @@ Example `server.json`:
823866 "reopenFIFO" : true ,
824867 "silenceDither" : false ,
825868 "silenceDitherMs" : 500 ,
869+ "fillerMode" : " silence" ,
870+ "fillerToneHz" : 1000 ,
871+ "fillerAfterMs" : 500 ,
826872 "verbose" : false ,
827873 "authUser" : " alice" ,
828874 "authPassword" : " s3cret" ,
@@ -860,7 +906,7 @@ This is what `ffmpeg -f s16le` produces, which is the standard raw PCM format.
860906
861907### Stream robustness
862908
863- Three options help the stream survive upstream hiccups:
909+ Four options help the stream survive upstream hiccups:
864910
865911- ** ` --keep-alive ` ** — after stdin EOF, hold the HTTP outputs open and feed
866912 the encoders silence (paced at sample-rate) so listeners aren't disconnected.
@@ -873,6 +919,27 @@ Three options help the stream survive upstream hiccups:
873919 the broadcaster substitutes inaudible TPDF dither (±1 LSB, ≈-90 dBFS), so
874920 downstream tools that flag pure-silence don't treat the stream as dead.
875921 Applies equally to stdin, UDP, and TCP input.
922+ - ** ` --filler-mode tone ` ** — replaces the silence emitted during input gaps
923+ with an audible sine wave at ` --filler-tone-hz ` (default 1000 Hz, -20 dBFS).
924+ Useful when listeners need a positive signal that the stream is up but the
925+ producer is between sources, rather than just hearing dead air. The phase
926+ accumulator carries across chunks so the tone has no audible clicks at
927+ chunk boundaries.
928+
929+ Triggers in three scenarios:
930+ - ** stdin EOF + ` --keep-alive ` ** (legacy behavior).
931+ - ** UDP input idle** : no packets for ` --filler-after-ms ` (default 500 ms).
932+ - ** TCP input idle** : connected client stops sending for ` --filler-after-ms ` .
933+
934+ ``` bash
935+ # Gqrx → LiveAudioServer; if you mute Gqrx's UDP output, listeners hear a
936+ # 1 kHz tone after 500 ms instead of dead air, until Gqrx resumes.
937+ .build/release/LiveAudioServer \
938+ --udp-input-port 7355 \
939+ --filler-mode tone \
940+ --filler-tone-hz 1000 \
941+ --keep-alive
942+ ```
876943
877944---
878945
0 commit comments