aethersdr / aethersdr/AetherSDR
Audio warning for critical conditions
Nobody has claimed this yet.
- Dominant language
- C++
- Stars
- 221
- Forks
- 117
- Avg merge
- 2d 7h
- Merged PRs (30d)
- 299
Description
Request preparation
- I used an AI assistant to help structure this request
- I checked for existing issues covering the same feature
What would you like?
Audio Alert System: Voice and Tone Warnings for SWR, Out-of-Band, and Power Limit Violations
What
An always-on, client-side safety monitor that watches live meter and slice data
and fires an audible alert the instant a configurable threshold is crossed.
No warning is generated while operating within limits — alerts trigger only
when a hard limit is exceeded.
Three alert conditions are monitored:
- High SWR — when the live SWR meter value exceeds a user-configured
threshold (default: 3.0:1) - Out-of-band / privilege violation — when the active slice frequency falls
outside allocations permitted for the operator's country and license class,
or when the selected mode is not permitted in the current band segment - Power limit exceeded — when the live forward-power meter reading exceeds
the regulatory limit for the operator's country, license class, and current band
Each condition can produce either a tone (synthesized chime/buzzer via
QAudioSink) or a spoken voice phrase via the Qt Text-to-Speech engine
(QTextToSpeech), selectable per-condition in preferences. Voice language is
freely configurable (any locale supported by the host system's TTS engine).
Why
FlexRadio SDRs are used by operators across the full experience spectrum, from
newly licensed Technicians still learning band plans to seasoned contesters
working pile-ups at 500+ QSOs/hour.
Newly licensed operators may not have band-edge frequencies or power limits
memorized. A spoken "out of band" or "power limit exceeded" warning — analogous
to an aircraft stall-warning horn — provides an immediate, eyes-free cue without
requiring them to glance at a frequency readout.
Experienced operators in a pile-up have focus locked on the logging software,
keyer, and headphones. Visual-only warnings in the SDR UI are easily missed
for tens of seconds. An audio alert reaches the operator instantly regardless
of where their eyes are.
Power limits are non-obvious and band-specific. In the US, for example,
60 m is limited to 100 W PEP ERP referenced to a dipole regardless of license
class, while all other HF bands allow up to 1,500 W for General and Extra.
These edge cases are easy to misconfigure on an amplifier without a dedicated
reminder.
How Other Clients Do It
SmartSDR for Windows (FlexRadio reference client)
SmartSDR does not implement audio alerts or a regulatory compliance monitor.
It shows SWR numerically in the TX applet and in the tuner panel, but produces
no audible or visual alarm when SWR is dangerously high or when the operator
is out of band. This is a gap the Linux community has long requested.
WSJT-X / JS8Call
These logging-oriented apps include a configurable audio alert for decoded
messages but have no TX compliance monitoring.
Ham Radio Deluxe
HRD's logbook can flag out-of-band log entries after the fact, but provides
no real-time audio alert during operation.
SDR# (Windows, Airspy)
SDR# has no TX capability, so no compliance alerts apply.
Aircraft avionics (design inspiration)
The design intent matches cockpit voice-alert systems (e.g., Garmin GNS/GTN
series "Caution: airspace" or stall-warning horn): a short, spoken phrase fires
once at threshold crossing, not repeatedly while the condition persists, to
avoid alert fatigue.
Suggested Behavior
Configuration (Radio Setup dialog → new "Alerts" tab)
| Setting | Type | Default |
|---|---|---|
| Alert mode | Tone / Voice / Tone + Voice / Off | Tone + Voice |
| Voice language | QLocale combo (system locales) | System default |
| Speech rate | Slider 0.5× – 2.0× | 1.0× |
| SWR alert threshold | Spin box 1.5 – 10.0 | 3.0:1 |
| Country | Combo (US / CA / UK / AU / DE / JP / …) | US |
| License class | Combo (Technician / General / Extra — or country-equivalent) | General |
| Power limit source | Auto (from table) / Manual override | Auto |
| Manual power limit | Spin box 1 – 2000 W | — |
All settings persist via AppSettings under keys such as
Alerts/Mode, Alerts/Language, Alerts/SwrThreshold,
Alerts/Country, Alerts/LicenseClass.
Alert behavior (all conditions)
- Alert fires once at the moment the threshold is crossed (leading edge).
- No repeat while condition persists — operator has heard it; repeating is
distracting during a pile-up. - A distinct all-clear tone or voice phrase fires when the condition clears
(e.g., SWR drops back below threshold, slice returns in-band). - All-clear is optional and defaults to off to reduce noise.
- If multiple conditions trigger simultaneously (e.g., out-of-band and
overpower on 60 m), each fires its own alert in sequence with 800 ms spacing.
Per-condition voice phrases (English examples)
| Condition | Spoken text |
|---|---|
| SWR exceeded | "High S-W-R" |
| SWR critical (≥ 5:1) | "Critical S-W-R — reduce power" |
| Out of band | "Out of band" |
| Mode not permitted | "Mode violation" |
| Power limit exceeded | "Power limit exceeded" |
| Band not permitted for class | "Band not authorized" |
| All clear (optional) | "Clear" |
Phrases are short by design — one to four words — to complete before the next
transmission cycle in a fast-paced contest exchange.
SWR alert
- Source: MeterModel meter name
"SWR"from source"SLC"(slice SWR meter,
decoded from VITA-49 PCC 0x8002). - Threshold crossing detected in
MeterModel::updateValues()or a new
AlertEngineclass that subscribes toMeterModel::meterUpdated.
Out-of-band / mode alert
- Source:
SliceModel::rfFrequency()andSliceModel::mode(). - The built-in ARRL band plan overlay (already rendered in
SpectrumWidget)
contains the per-license-class allocations — reuse or refactor that data
structure into a sharedBandPlanCheckerutility class. - Check on every
SliceModel::frequencyChangedandSliceModel::modeChanged
signal.
Power limit alert
- Source: MeterModel meter name
"FWDPWR"from source"TX"(forward power),
decoded from VITA-49 PCC 0x8002. - Limit table is compiled into a
PowerLimitTablestruct — country × license
class × band → watts PEP.
US limits (representative — full table to be compiled from Part 97):
| Band | Technician | General | Extra |
|---|---|---|---|
| 160 m | — | 1500 W | 1500 W |
| 80 m | — (CW segments only, 200 W) | 1500 W | 1500 W |
| 60 m | — | 100 W ERP | 100 W ERP |
| 40 m | — (CW only) | 1500 W | 1500 W |
| 30 m | — | 200 W | 200 W |
| 20 m – 10 m | varies | 1500 W | 1500 W |
| 6 m | 1500 W | 1500 W | 1500 W |
| VHF/UHF | 1500 W | 1500 W | 1500 W |
(60 m US limit is 100 W PEP ERP into a reference half-wave dipole — flag this
as an ERP limit in the UI since AetherSDR reads conducted power, not ERP.)
Protocol Hints
SWR meter value
S <handle>|meter <id>.src=SLC#<id>.num=<n>#<id>.nam=SWR#<id>.unit=SWR#...
VITA-49 PCC 0x8002 payload: (uint16 meter_id, int16 raw_value) pairs,
big-endian. SWR unit conversion: raw / 128.0f (confirmed in MeterModel).
Forward power meter value
S <handle>|meter <id>.src=TX#<id>.nam=FWDPWR#<id>.unit=Watts#...
Same VITA-49 stream. Watts conversion: raw / 1024.0f on fw v1.4.0.0.
Slice frequency and mode
S <handle>|slice 0 RF_frequency=14.225 mode=USB ...
Already parsed by SliceModel::applyStatus() — subscribe to
SliceModel::frequencyChanged(double) and SliceModel::modeChanged(QString).
Qt Text-to-Speech dependency
find_package(Qt6 REQUIRED COMPONENTS TextToSpeech)
target_link_libraries(AetherSDR PRIVATE Qt6::TextToSpeech)
Arch package: qt6-speech (pulls speechd or flite as backend).
Fall back gracefully to tone-only mode if no TTS engine is available on the
host (check QTextToSpeech::availableEngines().isEmpty()).
Tone generation (no TTS fallback)
Use QAudioSink with a synthesized sine/square wave buffer — the same
infrastructure already used by AudioEngine. No additional dependency.
Suggested Labels
feature GUI priority: medium safety
Notes for Implementers
- Place alert logic in a new
src/core/AlertEngineclass. It subscribes to
MeterModel,SliceModel, andAppSettings, and owns the
QTextToSpeechinstance. Keep it completely decoupled from the GUI. BandPlanCheckershould be extracted from the existing band-plan overlay
data inSpectrumWidget— avoid duplicating the allocation tables.- The 60 m ERP limit cannot be checked from conducted power alone; display a
tooltip or info badge noting "ERP limit — see antenna gain" rather than a
hard alert that may false-trigger. - Do not alert during
TUNEmode (whenTransmitModel::tuneActive()is
true) — reduced power during tune will not exceed the regulatory limit and
the SWR may be temporarily high while the ATU searches. - Alert engine must be dormant (no false triggers) while
RadioModelis
disconnected.
---
No existing issue covers this — I checked all 48 open issues against keywords including *audio, alert, warn, SWR, power, band, license, voice, tone, out-of-band, compliance*. Nothing overlaps. This is a new request, ready to paste directly into GitHub's issue editor.
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.
Research direction
Start by reading MeterModel::updateValues(), SliceModel::applyStatus(), the SpectrumWidget band-plan overlay, AudioEngine, and the AppSettings integration points. Done means the proposed alert conditions, persistence, tone and voice behavior, disconnected and TUNE safeguards, and graceful TTS fallback are implemented and verified across the listed entry points.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- cmake, cpp
- Domain
- design, desktop
- Issue type
- Feature
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 25/100