ASR (Copy Assist) indicator stays disabled in WFM mode on IC-705 — mode not included in isVoiceMode() What happened?
Nobody has claimed this yet.
Assessment
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Newbie friendliness
- 45/100
Research direction
Start with src/gui/VoiceModeGate.h and trace its use in src/gui/MainWindow.cpp, especially the ASR indicator update. Then inspect src/core/backends/icom/IcomModels.cpp, src/core/backends/icom/CivCodec.cpp, src/gui/RxApplet.cpp, and the ASR tap files to determine whether WFM provides usable speech audio. Done means the intended WFM policy is decided and the indicator and audio path are verified against it.
Written by the indexing model from the issue text.
Description
Report preparation
- I used the AI-assisted bug report tool (Help → Support → File an Issue)
- I have attached a support bundle or log file
What happened?
Title: ASR (Copy Assist) indicator stays disabled in WFM mode on IC-705 — mode not included in isVoiceMode()
What happened?
While operating an IC-705 (via the networked-Icom/CI-V backend) in WFM mode, the ASR (Copy Assist) status-bar indicator is greyed out and cannot be clicked to open the transcription panel.
What did you expect?
To be able to enable ASR/Copy Assist while receiving in WFM mode, since WFM can carry intelligible speech (e.g. broadcast FM, weather-radio voice announcements).
Steps to reproduce
Connect to an IC-705 over the networked-Icom CI-V backend.
Select or toggle WFM on the active slice (the VFO-flag WFM button, not the mode combo — WFM is not a m_modeCombo entry).
Attempt to click the ASR/Copy Assist indicator in the status bar.
Observe the indicator is dimmed/disabled and does not open the Copy Assist panel.
Radio model & firmware
Icom IC-705 (networked/CI-V backend — “early” support tier per project docs)
OS & version
AetherSDR: 26.8.4
Qt: 6.8.3
OS: macOS
Developer Notes
This is not a crash — it's deliberate, current gating logic, and the report is really "should WFM count as a voice mode?"
Root cause / relevant code:
src/gui/VoiceModeGate.h, lines 26–32 — isVoiceMode() is the single shared predicate used by both the DVK indicator and the ASR/Copy Assist indicator. Its mode list is:
cpp
return mode == QLatin1String("USB") || mode == QLatin1String("LSB")
|| mode == QLatin1String("AM") || mode == QLatin1String("SAM")
|| mode == QLatin1String("FM") || mode == QLatin1String("NFM")
|| mode == QLatin1String("DFM");
"WFM" is absent from this list. The header comment (lines 8–11) states the intent explicitly: only modes that "carry human-intelligible voice audio" are included, and WFM isn't among them by design — the project docs describe WFM as a per-slice demodulator aimed at satellite data, not voice.
src/gui/MainWindow.cpp, updateKeyerAvailability() (~line 9584 onward, ASR-specific block starting ~line 9695 under #ifdef AETHER_ASR_ENABLED): reads activeSlice()->mode() and calls isVoiceMode() on it (line 9733: const bool asrIsVoice = asrSlice && isVoiceMode(asrSlice->mode());). The indicator's enabled state is set at line ~9793: m_asrIndicator->setEnabled(asrIsVoice || asrVisible); — so with an active slice in WFM, asrIsVoice is false and the indicator stays disabled unless a panel is already open.
src/core/backends/icom/IcomModels.cpp, lines 231–232 confirm WFM is a real, receive-only mode reported by the IC-705 backend:
cpp
constexpr std::array<std::string_view, 10> kIc705Modes{
"USB", "LSB", "CW", "CWL", "AM", "FM", "DFM", "WFM", "DIGU", "DIGL"};
constexpr std::array<std::string_view, 1> kIc705ReceiveOnlyModes{"WFM"};
and src/core/backends/icom/CivCodec.cpp (lines 308, 352, 405, 497) maps the radio's raw CI-V mode byte to and from the exact string "WFM", so the string comparison in VoiceModeGate.h is comparing against the right value — this isn't a string-mismatch bug, it's a genuine mode-list omission (or, depending on intent, an omission worth revisiting).
src/gui/RxApplet.cpp (~line 539) confirms WFM is toggled via the VFO-flag WFM button rather than appearing in the mode combo, matching your repro steps.
Note src/models/SliceModel.cpp line 70 (filterCarrierStraddlingFamily()) does include "WFM"/"WBFM" alongside FM/NFM for filter-shape purposes — so WFM is already treated as "FM-family" in at least one other subsystem. That inconsistency (FM-family for filter shape, but excluded from voice-mode gating) is worth flagging to maintainers as the crux of the design question: is WFM meant to ever carry ASR-transcribable voice, or is it intentionally satellite/data-only per the roadmap?
Suggested logging categories to enable (Help → Support):
aether.asr.engine (AsrEngine.cpp)
aether.asr.tap (AsrAudioTap.cpp) — confirms whether the audio tap ever attaches
aether.icom.civ / aether.icom.session (IcomCivBackend.cpp, IcomSession.cpp) — confirms the exact mode string the IC-705 is reporting for the active slice at the time of the click
aether.icom.stream (IcomStream.cpp) — rules out a stream-side issue if this turns out to be more than the mode gate
Possible root causes to weigh:
Working as designed — WFM is treated purely as a satellite/data demodulator and Copy Assist is intentionally scoped to conversational voice modes only (matches header comment in VoiceModeGate.h).
Enhancement candidate — WFM legitimately carries speech in some use cases (broadcast FM, weather radio), so adding "WFM" to isVoiceMode() might be reasonable; would need to confirm the ASR audio tap (AsrAudioTap.cpp / AsrTapPolicy.h) receives usable post-DSP audio when the slice is in WFM before changing the gate, since the tap "locks onto a RECEIVER... never onto a slice" per the code comments at ~line 9705–9712 of MainWindow.cpp.
What did you expect?
No response
Steps to reproduce
- Connect to radio. 2. Select WFM. 3. Click on ASR
AetherSDR version
v26.8.4
Radio model & firmware
Icom 705
Operating system
macOS
OS version and hardware
Tahoe 26.6.2
- Dominant language
- C++
- Stars
- 221
- Forks
- 117
- Avg merge
- 2d 7h
- Merged PRs (30d)
- 299
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from aethersdr/AetherSDR
-
audio documentation good first issue maintainer-review
Difficulty 1/5 Under an hour Newbie friendliness 92/100
-
bug CW maintainer-review safety
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
-
docs(agents): family PRs must stay in the family tree (shared applet/pan/model edits stall review) Opendocumentation enhancement maintainer-review
Difficulty 1/5 1-3 hours Newbie friendliness 90/100
-
bug good first issue GUI maintainer-review priority: low
Difficulty 2/5 1-3 hours Newbie friendliness 84/100
-
bug
Difficulty 1/5 Under an hour Newbie friendliness 86/100
All issues in aethersdr/AetherSDR
Similar issues
-
Difficulty 2/5 1-3 hours Newbie friendliness 86/100
-
Sensor initialization takes very long when `--initial-sim-time` is set to current UNIX timestamp Open
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
gazebosim/gz-sensors#662 · 1 comment ·
-
enhancement
Difficulty 2/5 1-3 hours Newbie friendliness 76/100
-
comp-datalake
Difficulty 2/5 1-3 hours Newbie friendliness 88/100
ClickHouse/ClickHouse#121222 ·
-
Difficulty 2/5 1-3 hours Newbie friendliness 68/100
LadybirdBrowser/ladybird#12123 ·