|
3 | 3 | All notable changes to AetherSDR are documented in this file. |
4 | 4 | Format follows [Keep a Changelog](https://keepachangelog.com/). |
5 | 5 |
|
| 6 | +> **Versioning:** Starting with **v26.5.1**, AetherSDR moves to **CalVer** |
| 7 | +> (`YY.M.patch`). Earlier tags used semver through v0.9.8. |
| 8 | +
|
| 9 | +## [v26.5.1] — 2026-05-10 |
| 10 | + |
| 11 | +### 1.0 — first stable release; CalVer cutover |
| 12 | + |
| 13 | +The 1.0-equivalent. After eight 0.9.x cycles the client now covers |
| 14 | +every documented SmartSDR feature on the FLEX-6000, FLEX-8000, and |
| 15 | +Aurora platforms, and ships the Aetherial Audio Channel Strip's RX and |
| 16 | +TX paths in full. Confidence in stability across Linux / macOS / |
| 17 | +Windows is high enough to drop the pre-1.0 framing. |
| 18 | + |
| 19 | +Coincident with the milestone, the project switches from semver to |
| 20 | +**CalVer** (`YY.M.patch`). Rationale: AetherSDR's release cadence is |
| 21 | +driven by FlexLib protocol changes, ham contest seasons, and a steady |
| 22 | +trickle of community fixes — not by API stability commitments to |
| 23 | +downstream consumers. CalVer communicates "this is what shipped in |
| 24 | +month X" more honestly than a 1.x semantic version would. The previous |
| 25 | +`v0.9.x` tags remain in git history; new tags use the `vYY.M.patch` |
| 26 | +form starting here. |
| 27 | + |
| 28 | +55 commits since v0.9.8; highlights below. Big thanks to **@jensenpat** |
| 29 | +(macOS `.icns` build-time generation, FlexControl wheel modes, popout |
| 30 | +frameless lifecycle), **@chibondking** (Windows UI scaling settings |
| 31 | +path), **@rfoust** (DAX IQ Windows/non-PipeWire-Linux fix, RX output |
| 32 | +panel rebuild, TCI volume/drive/rx_volume dispatch), **@aethersdr-agent** |
| 33 | +(AetherClaude — parallel implementations on `aetherclaude-eligible` |
| 34 | +issues, including #2550 spot background_color), **@s53zo**, and |
| 35 | +**@M7HNF-Ian** for contributions across this cycle. |
| 36 | + |
| 37 | +### New features |
| 38 | + |
| 39 | +**S-History v2 — voice signal detection + QRM classification (#2426)** |
| 40 | +- New CNN classifier on the panadapter that distinguishes confirmed |
| 41 | + voice signals from QRM channels in the Signal History overlay. |
| 42 | + Voice markers age out independently of QRM markers (30 s after the |
| 43 | + last voice-width hit); QRM channels with voice riding on top get |
| 44 | + both markers simultaneously so operators can see the interference |
| 45 | + AND the person trying to work through it. |
| 46 | + |
| 47 | +**Connected Stations dialog when multiFLEX disabled (#2488)** |
| 48 | +- Operators running with multiFLEX off can now see who else is on |
| 49 | + the radio via Help → Connected Stations. Lists every connected |
| 50 | + client with handle, program, station, and ownership state. |
| 51 | + |
| 52 | +**FPS meters + performance telemetry (#2480)** |
| 53 | +- Footer FPS readouts for spectrum / waterfall plus a |
| 54 | + `PerfTelemetry::recordUiHeartbeat()` hook that captures the Qt |
| 55 | + event-loop cadence at 50 ms intervals. Feeds the future System Info |
| 56 | + diagnostics dialog (#2554). |
| 57 | + |
| 58 | +**8-axis edge resize for frameless main window (#2522)** |
| 59 | +- The main window's frameless mode now supports the full eight-axis |
| 60 | + resize grip (N/S/E/W/NE/NW/SE/SW) matching the Aetherial Audio |
| 61 | + Channel Strip and other frameless dialogs. |
| 62 | + |
| 63 | +**SpotHub Display tab + tunable Signal History (#2506)** |
| 64 | +- Consolidates the SpotHub display controls into a single tab with |
| 65 | + Signal History tunables (qualify duration, hide-after, suspect-QRM |
| 66 | + threshold). Sub-tabs replaced with grouped sections. |
| 67 | + |
| 68 | +**Frameless chrome on Memory Channels dialog (#2509)** |
| 69 | +- The Memory Channels dialog gets the standard 18 px gradient title |
| 70 | + bar, grip glyph, drag-to-move, double-click-to-maximize, 8-axis |
| 71 | + resize — matching NetworkDiagnosticsDialog and the Channel Strip. |
| 72 | + |
| 73 | +**Add Memory action moved into MemoryBrowsePanel (#2533)** |
| 74 | +- The "Add memory" button now lives in the MemoryBrowsePanel itself, |
| 75 | + closer to where users are looking when they want to capture the |
| 76 | + current slice. The slice-letter badge variant was dropped — adding |
| 77 | + always targets the active slice without per-letter selection. |
| 78 | + |
| 79 | +**Float popped-out applet panel as frameless project window (#2536)** |
| 80 | +- Popping out the applet panel via the new title-bar icon (or |
| 81 | + Ctrl+Shift+S) now floats it as a frameless project window with the |
| 82 | + full chrome treatment: gradient title bar, drag handle, 8-axis |
| 83 | + resize. Three new title-bar icons (dock-left / dock-right / pop-out) |
| 84 | + replace the legacy status-bar `☰` toggle. |
| 85 | + |
| 86 | +**Always-on-Top pin on popped-out applets (#2430, #2479)** |
| 87 | +- Per-container pin on the popped-out applet header keeps the float |
| 88 | + above the panadapter window for instrument-on-instrument workflows. |
| 89 | + |
| 90 | +**FlexControl WheelRit / WheelXit modes (#2452, #2455)** |
| 91 | +- Two new FlexControl USB knob assignment modes drive RIT and XIT |
| 92 | + offsets directly without touching the slice frequency. |
| 93 | + |
| 94 | +**Easter egg: Ctrl+Shift+A toggles starstruck pan-drag sound (#2534)** |
| 95 | +- Hidden audio cue tied to pan dragging — off by default, no shortcut |
| 96 | + reservation, harmless when not enabled. |
| 97 | + |
| 98 | +**Status-bar +PAN icon redrawn as a jagged FFT trace (#2537)** |
| 99 | +- Replaces the previous generic icon with a 30-point jagged FFT |
| 100 | + spectrum trace at 5 distinct peaks — matches the actual spectrum |
| 101 | + visual idiom AetherSDR is built around. |
| 102 | + |
| 103 | +### Bug fixes |
| 104 | + |
| 105 | +**Linux waterfall smear after TX (#2527, fixes #2527-class reports)** |
| 106 | +- 10–18 second post-TX vertical-stripe smear on Linux only. Root |
| 107 | + cause: `WaterfallBlanker` retained a TX-era "last good row" across |
| 108 | + the TX→RX transition; subsequent impulse-detection substitutions |
| 109 | + painted that row as a frozen vertical stripe until the ring rolled |
| 110 | + past it. Fix: clear `m_wfLastGoodRow` and reset `m_wfBlankerRingCount` |
| 111 | + on TX-exit; gate blanker substitution on `!m_transmitting`. |
| 112 | + |
| 113 | +**Slice reduction crash + float/dock GPU corruption + exit crash (#2495, #2512)** |
| 114 | +- Three Multi-Flex / multi-pan crashes consolidated. Slice reduction |
| 115 | + on disconnect cascade tripped a use-after-free in |
| 116 | + `wirePanadapter()`. Float→dock transitions on QRhiWidget panes |
| 117 | + corrupted the spectrum framebuffer until the next full repaint. |
| 118 | + Exit crash on rapid quit-while-streaming traced to a connection |
| 119 | + teardown ordering bug. All three guarded with lifetime checks. |
| 120 | + |
| 121 | +**Spot `background_color` honored when override is off (#2550, #2560)** |
| 122 | +- `SpotData::backgroundColor` was parsed from the FlexLib protocol |
| 123 | + and stored in the model, but dropped at the model→view boundary: |
| 124 | + `SpotMarker` didn't carry the field, the converter silently dropped |
| 125 | + it, and `drawSpotMarkers()` only drew the pill from the local |
| 126 | + Override Background color. Third-party spot sources |
| 127 | + (wave-flex-integrator, SpotCollector) encoding priority / |
| 128 | + worked-before via `background_color` now render correctly when |
| 129 | + Override Background is off. |
| 130 | + |
| 131 | +**ALC gauge rewired to SW ALC meter; mirror across Phone + CW (#2552)** |
| 132 | +- HWALC (RCA voltage telemetry) was driving the SmartSDR-equivalent |
| 133 | + ALC gauge, producing meaningless readings. Split into hwAlc / |
| 134 | + swAlc; the gauge now consumes the SW ALC meter (post-software-ALC |
| 135 | + SSB peak). Mirror identical gauge across Phone and CW panels with |
| 136 | + the new `HGauge::setFillFromRight` mode. |
| 137 | + |
| 138 | +**DSP curve widgets: HarfBuzz reshape on every paint (#2546, #2556)** |
| 139 | +- The DSP curve widgets (`ClientCompCurveWidget`, |
| 140 | + `ClientGateCurveWidget`, `ClientDeEssCurveWidget`) were calling |
| 141 | + `QPainter::drawText` for axis labels on every paint, forcing a |
| 142 | + full HarfBuzz reshape per frame. Cache axis labels as `QStaticText` |
| 143 | + with `AggressiveCaching`; ~7× drop in `shapeText` cost. |
| 144 | + |
| 145 | +**macOS app icon missing on local builds (#2558, jensenpat)** |
| 146 | +- `docs/AetherSDR.icns` was never committed (only generated inside |
| 147 | + the macos-dmg CI runner), so every local macOS dev build silently |
| 148 | + produced a generic-icon `.app`. Fixed by moving icns generation |
| 149 | + into CMake via `add_custom_command` sourced from the committed |
| 150 | + `docs/logo-circle.png`. No new build dependencies. |
| 151 | + |
| 152 | +**Stream Deck mute toggle TCI command (#2519)** |
| 153 | +- The mute action on Stream Deck mappings sent the wrong TCI command. |
| 154 | + Corrected to the canonical mute/unmute primitive. |
| 155 | + |
| 156 | +**DAX IQ silently broken on Windows / non-PipeWire Linux (#2524)** |
| 157 | +- DAX IQ streams produced no output on Windows and on Linux systems |
| 158 | + without PipeWire (PulseAudio-only). Root cause: the IQ stream |
| 159 | + setup path assumed PipeWire native and silently returned without |
| 160 | + initialization on other platforms. Adds the proper fallback. |
| 161 | + |
| 162 | +**Windows ClangCL build failures (#2525)** |
| 163 | +- ClangCL toolchain failures for NR4/specbleach and other modules |
| 164 | + resolved with target-specific include path adjustments. |
| 165 | + |
| 166 | +**Memory recall radio state sync (#2526)** |
| 167 | +- Recalling a memory entry now correctly syncs all radio state (mode, |
| 168 | + filter, slice settings) instead of just frequency. |
| 169 | + |
| 170 | +**RADE mode not disabled on PTT release (#2517)** |
| 171 | +- Mic metering during RADE TX could be interrupted if RADE auto- |
| 172 | + disabled on key-up. Now stays in RADE mode across PTT cycles. |
| 173 | + |
| 174 | +**RX output panel rebuild with canonical meter ballistics (#2514)** |
| 175 | +- Aetherial Audio Channel Strip's RX output panel rebuilt to use the |
| 176 | + canonical `MeterSmoother` ballistics (30 ms attack, 180 ms release |
| 177 | + at 120 Hz) — matches every other meter in the app. |
| 178 | + |
| 179 | +**XVTR Flex band-stack key uses status index, not order (#2342, #2511)** |
| 180 | +- Band-stack persistence keyed off the position-in-list of XVTR |
| 181 | + entries; if the radio reordered them, recall pulled the wrong |
| 182 | + entry. Now keys on the radio-supplied status index. |
| 183 | + |
| 184 | +**Frameless float popout follows frameless setting (#2449)** |
| 185 | +- Popped-out applets now respect the global "use frameless windows" |
| 186 | + preference — previously they were always system-decorated. |
| 187 | + |
| 188 | +**MIDI toggle params + modeUp/Down + category filter (#2446)** |
| 189 | +- Toggle MIDI params no longer auto-revert on note release. |
| 190 | + Adds `modeUp` / `modeDown` actions. Category filter in MIDI Learn |
| 191 | + expanded to cover every action group. |
| 192 | + |
| 193 | +**RTTY squelch auto-disable (#2504, #2510)** |
| 194 | +- Switching to RTTY mode now auto-disables squelch (squelch on RTTY |
| 195 | + notches characters out and breaks decoding). |
| 196 | + |
| 197 | +**NR4 button disabled when libspecbleach unavailable (#2484, #2508)** |
| 198 | +- Builds without `libspecbleach` left the NR4 button live but |
| 199 | + no-op — confusing operators about what NR4 actually does. Button |
| 200 | + is now disabled with a tooltip when the dependency is missing. |
| 201 | + |
| 202 | +**CWX release TX when queue drains (#2450, #2507)** |
| 203 | +- CWX macros could leave the radio stuck in TX if the queue drained |
| 204 | + without an explicit end-of-message marker. Now releases TX when |
| 205 | + the queue is empty. |
| 206 | + |
| 207 | +**Audio mute restore on reconnect (#2489)** |
| 208 | +- Reconnecting to the radio no longer restores per-slice audio mute |
| 209 | + state — that's a radio-authoritative setting per the |
| 210 | + Radio-Authoritative Settings Policy. |
| 211 | + |
| 212 | +**QsoRecorder QTimer playback → QAudioSink pull mode (#2295, #2487)** |
| 213 | +- QSO recorder playback used a `QTimer` to push audio buffers, |
| 214 | + producing audible glitches under high system load. Rewritten to |
| 215 | + `QAudioSink` pull mode for glitch-free playback. |
| 216 | + |
| 217 | +**Slice capacity clamp to model limit (#2477)** |
| 218 | +- Some radio models report a slice count higher than they actually |
| 219 | + support. Client now clamps to the model-specific limit. |
| 220 | + |
| 221 | +**DVK F1-F12 shortcut conflict with CwxPanel (#2464, #2469)** |
| 222 | +- F-key shortcuts triggered both DVK and CWX panels when both were |
| 223 | + visible. Resolved via panel-scoped shortcut routing. |
| 224 | + |
| 225 | +**ShackSwitch button stale visibility (#2456)** |
| 226 | +- Top-right tray's ShackSwitch button stayed visible after the |
| 227 | + ShackSwitch feature was disabled. Now toggles in lockstep. |
| 228 | + |
| 229 | +**RX applet radeActivated guard (#2376)** |
| 230 | +- `RxApplet` was missing the RADE-active guard that `VfoWidget` |
| 231 | + uses — could fire stale mode-change events while RADE was busy. |
| 232 | + |
| 233 | +**Avoid unchanged spot overlay repaints (#2474)** |
| 234 | +- Spot marker list was being rebuilt and repainted on every spot |
| 235 | + source update even when no visual change occurred. New |
| 236 | + `spotMarkersVisuallyEqual()` predicate gates the repaint. |
| 237 | + |
| 238 | +**Reassert desired panadapter and waterfall display rates (#2465)** |
| 239 | +- Radio reconnect could silently leave the panadapter and waterfall |
| 240 | + at the radio's default display rate (10 Hz) instead of the |
| 241 | + client's configured rate. Now reasserted on every reconnect. |
| 242 | + |
| 243 | +**Windows 48 kHz L-R audio pan (#2403, #2459)** |
| 244 | +- L-R audio panning was incorrect on the Windows 48 kHz resampler |
| 245 | + path. Restored to match the macOS / native-rate paths. |
| 246 | + |
| 247 | +**Protocol: send client program/low_bw_connect before client gui (#2466)** |
| 248 | +- Subscription order matters on the FlexLib side; sending `client |
| 249 | + program` and `client low_bw_connect` after `client gui` caused |
| 250 | + intermittent rejection of metadata. Reordered to match what |
| 251 | + SmartSDR-for-Windows does. |
| 252 | + |
| 253 | +**TCI volume/drive/rx_volume command dispatch (#1764, #2463)** |
| 254 | +- Three TCI v2.0 commands had no dispatch wiring on AetherSDR's |
| 255 | + side. Added the three handlers + bidirectional state sync. |
| 256 | + |
| 257 | +**Spectrum cursor update guards (#2461)** |
| 258 | +- Spectrum cursor position updates fired without checking widget |
| 259 | + lifetime, producing rare null-deref crashes during layout changes. |
| 260 | + |
| 261 | +**AmpApplet telemetry forwarding (#2444)** |
| 262 | +- Amplifier telemetry from the radio (id, vac, meffa, temp) was |
| 263 | + parsed but not forwarded to `AmpApplet`. Wired through. |
| 264 | + |
| 265 | +**Windows UI scaling settings path (#2443)** |
| 266 | +- Pre-Qt settings read on Windows used the Linux path convention. |
| 267 | + Corrected to `%APPDATA%/AetherSDR/`. |
| 268 | + |
| 269 | +**FreeDV Station Msg live-update without restart (#2476)** |
| 270 | +- The Station Msg field in FreeDV settings required an app restart |
| 271 | + to take effect. Now live-updates the reporter. |
| 272 | + |
| 273 | +**Container pop-out glyph + size (#2499)** |
| 274 | +- Switches the pop-out glyph to `⧉` at a larger size for |
| 275 | + discoverability. |
| 276 | + |
| 277 | +**Minimal mode hides dock-side icons (#2562)** |
| 278 | +- The three dock-side selectors (left dock, right dock, pop-out) |
| 279 | + and their separator are now hidden in minimal mode — they have |
| 280 | + no meaning when the spectrum is hidden. |
| 281 | + |
| 282 | +**View → Applet Panel / Pop Out menu entries removed (#2540)** |
| 283 | +- Both menu entries are redundant with the new title-bar dock-side |
| 284 | + icons (#2536) and the Ctrl+Shift+S window-scoped shortcut. |
| 285 | + |
| 286 | +**Reconnect dialog chrome polish (#2541)** |
| 287 | +- The reconnect dialog gets the frameless gradient title bar and |
| 288 | + proper chrome to match the rest of the app. |
| 289 | + |
| 290 | +### Closed without fix |
| 291 | + |
| 292 | +**`_platform_memmove` cost in macOS backing-store flush (#2547, #2548)** |
| 293 | +- Two related claims about Qt's widget-RHI fallback cost on macOS |
| 294 | + (#2547) and 30 Hz hidden-widget timer storms (#2548). Implemented |
| 295 | + the #2548 fix in full (~150 LOC, 10 widgets timer-gated on |
| 296 | + visibility) and measured before/after with `perf record -F 99 -g` |
| 297 | + on Linux: paint pipeline cost moved 16.8 % → 15.7 %, within noise. |
| 298 | + Reverted; closed both as `wontfix`. Reopen with matched windowed |
| 299 | + macOS profiling if the cost ever reproduces. |
| 300 | + |
| 301 | +### Infrastructure |
| 302 | + |
| 303 | +**Buffered async file logging (#2478)** |
| 304 | +- AetherSDR's log file path now flushes via a buffered async writer |
| 305 | + to avoid blocking the GUI thread on slow disks (especially network |
| 306 | + shares on macOS). |
| 307 | + |
| 308 | +**FPS meters + perf telemetry framework (#2480)** |
| 309 | +- Foundation for the System Info diagnostics dialog (#2554) — see |
| 310 | + Features above. |
| 311 | + |
| 312 | +**actions/cache bump 4 → 5 (#2493)** |
| 313 | +- Dependabot bump for the GitHub Actions cache action. |
| 314 | + |
| 315 | +**Qt 6.7+ GPU rendering requirement documented (#2531, #756)** |
| 316 | +- README now documents the minimum Qt version for GPU spectrum |
| 317 | + rendering. Older Qt falls back to CPU rasterization. |
| 318 | + |
| 319 | +**README supported hardware refresh (#2532)** |
| 320 | +- Aurora 510M, RT-series, ML-series, CL-series additions to the |
| 321 | + Supported Hardware list. AU-520 confirmed working. |
| 322 | + |
| 323 | +**libopengl0 build dep documented (#2523)** |
| 324 | +- Ubuntu/Debian build instructions now list `libopengl0` explicitly. |
| 325 | + |
| 326 | +**1.0 release prep — stale reference sweep (#2515)** |
| 327 | +- Sweep across CLAUDE.md, README.md, CHANGELOG.md, and |
| 328 | + `docs/architecture-pipelines.md` removing pre-1.0 framing and |
| 329 | + TODO breadcrumbs. |
| 330 | + |
6 | 331 | ## [v0.9.8] — 2026-05-06 |
7 | 332 |
|
8 | 333 | ### Aetherial Audio Channel Strip RX + community-driven reliability sweep |
|
0 commit comments