Fix DAX TX latency and jitter on Linux (PipeWire)#671
Closed
SA7LAV wants to merge 1 commit into
Closed
Conversation
The DAX TX audio path via module-pipe-sink suffered from high latency (~300ms+) and audible signal jitter, making FT8/FT4 digital modes unreliable — transmitted signals arrived too late in the time slot to be decoded by receiving stations. Three changes to PipeWireAudioBridge (Linux-only, no impact on Windows/macOS builds): 1. Reduce pipe-sink buffer from default (~64KB) to 2048 bytes (~42ms at 24kHz mono s16le). The large default buffer added unnecessary latency before audio reached the read side of the pipe. 2. Switch TX poll timer from 10ms (CoarseTimer) to 5ms with Qt::PreciseTimer for more consistent audio delivery. 3. Drain the pipe fully on each timer tick (read loop until EAGAIN) instead of a single read per tick. When the timer fires late, the old single-read left stale data in the pipe that compounded into bufferbloat; the drain loop delivers all available audio immediately. Tested with WSJT-X Improved running FT4 and FT8 on a FLEX-8400. Before: ~10W output (vs 60W tune), jittery waterfall, no decodes by remote stations. After: stable power output, clean signal, successful QSOs. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
auto-merge was automatically disabled
April 4, 2026 16:35
Pull request was closed
ten9876
added a commit
that referenced
this pull request
Apr 4, 2026
Reduce pipe-sink buffer from default ~64KB to 2048 bytes (~42ms at 24kHz mono s16le), switch TX poll timer from 10ms CoarseTimer to 5ms PreciseTimer, and drain pipe fully per tick to prevent bufferbloat when the timer fires late. Original PR by @SA7LAV — branch was deleted before auto-merge completed, applied from cached diff. Co-Authored-By: SA7LAV <SA7LAV@users.noreply.github.com> Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Collaborator
|
Claude here. Your branch was deleted before CI finished, which cancelled the auto-merge. The fix looked solid — we reviewed the diff, verified the Thanks for the contribution — this will help all the FT8/FT4 operators on PipeWire. 73, Jeremy KK7GWY & Claude (AI dev partner) |
ten9876
added a commit
that referenced
this pull request
Apr 4, 2026
Reduce pipe-sink buffer from default ~64KB to 2048 bytes (~42ms at 24kHz mono s16le), switch TX poll timer from 10ms CoarseTimer to 5ms PreciseTimer, and drain pipe fully per tick to prevent bufferbloat when the timer fires late. Original PR by @SA7LAV — branch was deleted before auto-merge completed, applied from cached diff. Co-authored-by: SA7LAV <SA7LAV@users.noreply.github.com> Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
CoarseTimerto 5msQt::PreciseTimerfor more consistent audio delivery to the radioEAGAIN) instead of single-read, preventing bufferbloat when the timer fires lateProblem
When using WSJT-X (or similar digital mode software) with AetherSDR on Linux via PipeWire, the DAX TX audio path had ~300ms+ total latency and produced a jittery signal on the waterfall. This caused:
Root cause
The
module-pipe-sinkdefault pipe buffer is large (~64KB), adding ~200ms of latency. Combined with the 10msQTimer::CoarseTimer(which can jitter to 15-20ms) and single-read-per-tick behavior, audio arrived at the radio in irregular bursts with significant delay.Scope
Linux only —
PipeWireAudioBridge.cppis compiled only on Linux (elseif(UNIX)in CMakeLists.txt). Windows and macOS builds are completely unaffected.Test plan
🤖 Generated with Claude Code