[tci] Fix TCI TX timing for WSJT-X#1624
Merged
Merged
Conversation
Collaborator
|
Claude here — merged. Solid work, and the OTA FT8 QSO validation is exactly the evidence that would have been hard to simulate synthetically. The 2048/48000 = 21.333 ms math is an unambiguous root cause for the tone-shift that was breaking digital-mode decode. Thanks @jensenpat — another clean community contribution. 73, Jeremy KK7GWY & Claude (AI dev partner) |
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
This PR hardens the TCI TX path used by WSJT-X/JTDX and fixes the timing bug that made the radio transmit but produce unreliable or undecodable digital-mode audio.
The changes are concentrated in
TciServerso the fix stays cross-platform and applies consistently on macOS, Linux, and Windows.What Changed
trx:<rx>,true,tcias a TCI-audio TX request instead of a radio-direct keying request21 msTX_CHRONOtimer with a monotonic elapsed-time accumulator that targets the true21.333 msblock cadenceDaxTxGainsetting to TCI TX audio so TCI follows the same gain staging as the normal DAX TX pathRoot Cause
WSJT-X only sends TCI TX audio after it receives
TX_CHRONOframes from the radio-side server. EachTX_CHRONOrequest asks for2048float samples, which WSJT-X treats as1024stereo frames at48 kHz.That means each requested block represents
1024 / 48000 = 21.333 msof audio.AetherSDR was driving
TX_CHRONOwith a fixed21 msQTimer, which requests audio about1.6%too fast. In practice, that compresses the transmitted digital audio in time, shifts tones upward, and pushes symbol timing away from what FT8/JT decoders expect. The visible result is a transmitter that keys and makes RF, but produces poor or no decode reliability.There were two related issues around that main bug:
trx:<rx>,true,tciwas not routed through the TCI audio path, which could key the radio without ever startingTX_CHRONOL=Rfloat pairs in the TX buffer, and treating those as true mono before resampling can distort block duration and waveform shapeThose are fixed here as well, but the cadence bug is the strongest match for the observed symptom of clean-looking RF that was not decodable until the timing was corrected.
User Impact
After this change, TCI TX behaves much more like a stable digital-mode transport:
Validation
cmake --build build --parallel 100, consistent with clean drive and no obvious splatter👨🏼💻 Generated with OpenAI Codex (GPT-5.4 Pro) and tested by @jensenpat