No PC-side CW sidetone when keying via radio's front-panel CW jack (source=HWCW)
Summary
When CW is keyed via the radio's front-panel paddle/straight-key jack (source=HWCW), the radio generates sidetone correctly to its own headphone output, but no sidetone reaches AetherSDR's selected audio output device. AetherSDR's local sidetone generator (the one targeted by #2899 / #2669 / #2105 etc.) does not fire on state=TRANSMITTING source=HWCW events, and the radio's sidetone is not being injected into the streamed audio paths (DAX / MultiFlex / remote_audio_rx).
Net effect: operators who key directly into the radio with the audio set to play through PC speakers hear silence during TX.
Environment
- AetherSDR: v26.5.3 (Windows x64)
- Radio: FLEX-6700, firmware via SmartSDR v4.2.18 DAX driver (recently consolidated from v4.1.5)
- OS: Windows 11 Home 10.0.26200
- Audio output: HDMI to TV (intentional — operator wants TV speakers as the listening device)
- Key path: iambic paddle and straight key plugged into the radio's front-panel CW jack (radio-side keying, no PC-side keyer involved)
Reproduction
- Connect AetherSDR to a FLEX-6700 / 6000-series radio.
- Set the AetherSDR audio output device to something other than the radio's own audio (in this case HDMI/TV).
- In Radio Setup ensure
sidetone=1 and mon_gain_cw > 0 (here: 100).
- Key the paddle or straight key into the radio's front CW jack.
- Observed: sidetone audible at the radio's front phones jack, silent at the selected PC audio output.
- Expected: sidetone audible at the selected PC audio output.
Log evidence
From aethersdr-20260524-152546.log (Windows, v26.5.3):
Audio routing — selected sink is the TV (intentional), sidetone sink matches
[15:25:47.019] INF aether.audio.summary: Audio startup summary:
output selected="TOSHIBA-TV (NVIDIA High Definition Audio)" default="..." saved=not configured source="system default"
pcAudio=yes txMicRoute="Unknown (radio status not received)" micSelection="Unknown" dax=unknown
[15:25:48.333] INF aether.audio.summary: Audio CW sidetone summary:
backend="QAudioSink" device="TOSHIBA-TV (NVIDIA High Definition Audio)" rate=48000Hz
Sidetone sink is declared and matches the selected output, but never actually streams audio.
Radio side — sidetone enabled, CW MON at max
[15:45:56.310] DBG aether.connection: RX: "S42E590E3|transmit sb_monitor=1 mon_gain_sb=25 mon_pan_sb=50
pitch=600 speed=15 iambic=1 iambic_mode=1 swap_paddles=0 break_in=1 break_in_delay=5
cwl_enabled=0 sidetone=1 mon_gain_cw=100 mon_pan_cw=57 synccwx=1"
CWX-block routing flags — both off
[15:25:50.863] DBG aether.connection: RX: "S42E590E3|cwx wpm=15 break_in_delay=5 qsk_enabled=1
dax_sidetone_enabled=0 mf_sidetone_enabled=0"
dax_sidetone_enabled / mf_sidetone_enabled are documented on cwx only — there is no equivalent toggle on the general transmit block to inject HWCW sidetone into the streamed audio.
TX events — source=HWCW, repeating during paddle keying
[15:46:11.667] DBG aether.connection: RX: "S0|interlock tx_client_handle=0x42E590E3
state=PTT_REQUESTED reason= source=HWCW tx_allowed=1 amplifier="
[15:46:11.668] DBG aether.connection: RX: "S0|interlock tx_client_handle=0x42E590E3
state=TRANSMITTING reason= source=HWCW tx_allowed=1 amplifier="
... (repeats through 15:48:12)
No AetherSDR audio activity during these TX events
Grepping the 15:46–15:48 window for audio, sidetone, stream, mute, gate returns only the standing setup lines and a one-off mixer headphone mute 1/0 toggle (manual test by the operator) — no startSidetoneStream, no AudioEngine state change, no gate transition keyed on the HWCW PTT events.
Diagnosis
A/B/C testing isolates the gap as HWCW-specific, in AetherSDR's local sidetone trigger logic — not device, sink, or routing related:
The local sidetone generator subscribes to CWX events but not to source=HWCW PTT events. The radio's HWCW sidetone bus routes only to the radio's local headphone output, so absent local synthesis nothing reaches the PC sink.
Net: a working, already-deployed sidetone synthesiser inside AetherSDR isn't being triggered for hardware-front-panel keying.
Suggested direction
Trigger the existing local sidetone generator from interlock state=TRANSMITTING / RECEIVE source=HWCW edges, mirroring the CWX wiring. The synthesiser, the sink, the gain, and the pitch handling are already in place — only the additional trigger is missing.
Open question for the team: keying-element timing. CWX knows the dit/dah pattern up front. For HWCW the radio doesn't appear to emit per-element timing over TCI / SmartSDR. One pragmatic starting point: drive the sidetone envelope directly from the TRANSMITTING / RECEIVE interlock edges themselves — one tone-on / tone-off per state transition. Imperfect at high QSK speeds where interlock RTT could lose elements, but transformative compared to current silence, and a deeper fix can iterate from there. Happy to be redirected toward a better mechanism if one exists.
Sibling of
#1075 "Local sidetone and USB paddle/key not working" — that issue is for USB paddle/key going through AetherSDR; this is the FlexRadio-front-jack equivalent. Same gap, different keying path.
Validation plan
- ✅ A/B with CWX through HDMI/TV sink — sidetone audible.
- ✅ A/B with CWX through USB headset sink — sidetone audible (different device, same result).
- ✅ HWCW through both sinks — silent (confirms not sink-specific).
- After fix: paddle into front jack → sidetone at PC sink synchronized (within interlock RTT) with keying.
- Cross-platform regression check (Windows / macOS / Linux) — I can validate on all three.
/cc @jensenpat (audio architecture, #2899 / #2973) and @ten9876 (maintainer, FlexRadio firmware knowledge).
73, Nigel G0JKN/W3 (FLEX-6700)
No PC-side CW sidetone when keying via radio's front-panel CW jack (source=HWCW)
Summary
When CW is keyed via the radio's front-panel paddle/straight-key jack (
source=HWCW), the radio generates sidetone correctly to its own headphone output, but no sidetone reaches AetherSDR's selected audio output device. AetherSDR's local sidetone generator (the one targeted by #2899 / #2669 / #2105 etc.) does not fire onstate=TRANSMITTING source=HWCWevents, and the radio's sidetone is not being injected into the streamed audio paths (DAX / MultiFlex / remote_audio_rx).Net effect: operators who key directly into the radio with the audio set to play through PC speakers hear silence during TX.
Environment
Reproduction
sidetone=1andmon_gain_cw> 0 (here: 100).Log evidence
From
aethersdr-20260524-152546.log(Windows, v26.5.3):Audio routing — selected sink is the TV (intentional), sidetone sink matches
Sidetone sink is declared and matches the selected output, but never actually streams audio.
Radio side — sidetone enabled, CW MON at max
CWX-block routing flags — both off
dax_sidetone_enabled/mf_sidetone_enabledare documented oncwxonly — there is no equivalent toggle on the generaltransmitblock to inject HWCW sidetone into the streamed audio.TX events — source=HWCW, repeating during paddle keying
No AetherSDR audio activity during these TX events
Grepping the 15:46–15:48 window for
audio,sidetone,stream,mute,gatereturns only the standing setup lines and a one-offmixer headphone mute 1/0toggle (manual test by the operator) — nostartSidetoneStream, no AudioEngine state change, no gate transition keyed on the HWCW PTT events.Diagnosis
A/B/C testing isolates the gap as HWCW-specific, in AetherSDR's local sidetone trigger logic — not device, sink, or routing related:
dax_sidetone_enabled=0andmf_sidetone_enabled=0. The tone is being generated locally by AetherSDR (the synthesiser landed by Local CW sidetone with dedicated low-latency sink and CWX support #1969 / Fix CW sidetone missing on Windows by calling startSidetoneStream() (#2100) #2105 / fix(cw): Int16 fallback for sidetone sink on Int16-only WASAPI devices (#2668). Principle I. #2669 / bug(cwx): CW sidetone ignores speaker mute — dedicated sink bypasses AudioEngine::setMuted() #2755 / [bug] Route CW sidetone to selected audio output #2899 / fix(rigctl): route cwx send/clear through CwxModel for CAT sidetone (#2909). Principle I. #2914), not delivered by any radio-side audio stream.The local sidetone generator subscribes to CWX events but not to
source=HWCWPTT events. The radio's HWCW sidetone bus routes only to the radio's local headphone output, so absent local synthesis nothing reaches the PC sink.Net: a working, already-deployed sidetone synthesiser inside AetherSDR isn't being triggered for hardware-front-panel keying.
Suggested direction
Trigger the existing local sidetone generator from
interlock state=TRANSMITTING / RECEIVE source=HWCWedges, mirroring the CWX wiring. The synthesiser, the sink, the gain, and the pitch handling are already in place — only the additional trigger is missing.Open question for the team: keying-element timing. CWX knows the dit/dah pattern up front. For HWCW the radio doesn't appear to emit per-element timing over TCI / SmartSDR. One pragmatic starting point: drive the sidetone envelope directly from the
TRANSMITTING/RECEIVEinterlock edges themselves — one tone-on / tone-off per state transition. Imperfect at high QSK speeds where interlock RTT could lose elements, but transformative compared to current silence, and a deeper fix can iterate from there. Happy to be redirected toward a better mechanism if one exists.Sibling of
#1075 "Local sidetone and USB paddle/key not working" — that issue is for USB paddle/key going through AetherSDR; this is the FlexRadio-front-jack equivalent. Same gap, different keying path.
Validation plan
/cc @jensenpat (audio architecture, #2899 / #2973) and @ten9876 (maintainer, FlexRadio firmware knowledge).
73, Nigel G0JKN/W3 (FLEX-6700)