Skip to content

RTL: add opt-in native digital broadcast reception and local metadata - #6002

Draft
Ozy311 wants to merge 9 commits into
mainfrom
codex/rtl-native-hd-fm
Draft

Ozy311 wants to merge 9 commits into
mainfrom
codex/rtl-native-hd-fm

Conversation

@Ozy311

@Ozy311 Ozy311 commented Sep 28, 2026 •

Copy link
Copy Markdown
Contributor

Optional Digital FM reception and passive station/program metadata remain a separate, deferred proposal under RFC #6079. This PR stays draft. Analog RTL delivery #6083 does not depend on its approval.

Scope

Head a8112373126246df213ee944dc07804f73a8263e, stacked on analog a3458b0919cfbb2ec0314444f876dd6c8296473f. The two existing Digital commits were reconciled with the current analog parent, followed by the build-control and user-documentation separation. Main's newer spectrum transition/epoch guards and dependency notices are preserved.

A WFM receiver can select Digital, choose a discovered audio program, and display reception state and station/program metadata. Aether owns USB and supplies IQ to the embedded decoder. Selected audio is 44.1 kHz stereo with explicit speaker conversion. Analog RDS, automatic analog/digital blending and multiple Digital decoders remain outside this proposal.

This PR now owns the actual default-OFF ENABLE_HD_FM option, all explicit OFF flags in AppImage/macOS/Windows publishing workflows and local installer/build entry points, and the matching build documentation. The analog parent no longer declares or passes the switch. Its existing ON implementation, internal identifiers and pinned decoder sources are preserved. Official releases keep the optional decoder OFF.

The optional dependency/worker design and RF-footprint admission remain subject to their own review. Normal analog and Digital capacity limits remain distinct.

Validation

Exact head a8112373, native Nobara / GCC 16.2.1 / Qt 6.12 / Release: OFF 15/15 passed (85.34 s), ON 17/17 passed (86.75 s), zero skips or failures. Both configurations exercise capture/registry/pipeline/model acceptance, PCM/rate conversion, DAX/TCI, persisted controls, WFM controls, broadcast overlay and the opt-in real SpectrumWidget geometry test. ON additionally exercises the native decoder and receiver. RTL is required; unrelated ASR, RADE and DFNR are disabled in this focused test configuration. This is offline integration evidence, not a full Digital release package or live-audio qualification.

Generated/routing/registration, build-options and LogAnalyzer checks pass, as does the user-documentation production build. GitHub verifies every published commit. Both actual decoder CMake modules and pinned decoder source/manifests/compatibility files are byte-identical to the prior Digital head.

Historical offline and operator evidence remains in the discussion and prior revisions. It does not qualify this new head for release. Previously reported endpoint-empty observations, startup queue drops, allocation-failure handling and native-call cancellation limits remain unresolved; no new uninterrupted acoustic playback, sanitizer or capacity qualification is claimed.

No release, Store publication or Digital readiness change is requested.


73, Ozy K6OZY · Codex

@Ozy311 Ozy311 self-assigned this Sep 28, 2026
@github-actions

Copy link
Copy Markdown

Accessibility check findings

This PR touches src/gui/ files with 2 accessibility issue(s).
Full details appear as inline annotations on the diff above.

Files scanned : 13
Files with findings: 1
Total findings : 2

See docs/a11y.md for the canonical
Qt patterns (setAccessibleName, QAccessibleValueChangeEvent,
QAccessibleInterface subclasses, etc.). Structural remediation
(keyboard navigation, custom QAccessibleInterface subclasses)
is tracked in #3288.

Findings are warnings only — the build is not blocked.

@github-actions

Copy link
Copy Markdown

Accessibility check findings

This PR touches src/gui/ files with 2 accessibility issue(s).
Full details appear as inline annotations on the diff above.

Files scanned : 13
Files with findings: 1
Total findings : 2

See docs/a11y.md for the canonical
Qt patterns (setAccessibleName, QAccessibleValueChangeEvent,
QAccessibleInterface subclasses, etc.). Structural remediation
(keyboard navigation, custom QAccessibleInterface subclasses)
is tracked in #3288.

Findings are warnings only — the build is not blocked.

1 similar comment
@github-actions

github-actions Bot commented Oct 2, 2026

Copy link
Copy Markdown

Accessibility check findings

This PR touches src/gui/ files with 2 accessibility issue(s).
Full details appear as inline annotations on the diff above.

Files scanned : 13
Files with findings: 1
Total findings : 2

See docs/a11y.md for the canonical
Qt patterns (setAccessibleName, QAccessibleValueChangeEvent,
QAccessibleInterface subclasses, etc.). Structural remediation
(keyboard navigation, custom QAccessibleInterface subclasses)
is tracked in #3288.

Findings are warnings only — the build is not blocked.

@aethersdr-agent

Copy link
Copy Markdown
Contributor

CI on dc24df83: one stale generated file, one line

Good news first — this is not a code problem and not CI infrastructure. Sanitizer option configures passed. Only Static checks failed, and only one of its 20 steps:

  • aetherd touchpoint manifest → python tools/gen_touchpoint_manifest.py --check
  • Run: 36948660445. (The other run on this SHA, 36948659991, was cancelled by the concurrency group, not failed — ignore it.)

What it is

I reproduced it on dc24df83 and regenerated. The whole difference is one number in docs/architecture/aetherd-touchpoints.md:

-| `core/backends/RadioCapabilities.h` | 10 | universal — Backend-neutral capability descriptor … | unconverted |
+| `core/backends/RadioCapabilities.h` | 11 | universal — Backend-neutral capability descriptor … | unconverted |

That column counts UI files that #include the header. Your stack adds two such includes on top of main's 9:

  • src/gui/ModeFilterPresets.cpp — 41fc9314
  • src/gui/WfmApplet.h — 208bc220

The includes themselves are fine. RadioCapabilities.h is tagged universal in the manifest — "the UI reaching this header is the seam working as designed, not coupling." The check's other half (invalid_live_tags, the one that rejects an untagged touchpoint) passed. Only the generated table is behind.

Fix

python tools/gen_touchpoint_manifest.py
git add docs/architecture/aetherd-touchpoints.md

That's the whole fix — 1 insertion, 1 deletion.

The part worth knowing: the whole stack is red on this, not just #6002

I ran --check at each head. #5924 is clean; everything above it is one behind, each needing the same one-line regeneration:

head PR manifest says tree has
e5f7b46b #5924 — in sync ✅
824b784a #5973 9 10
4ddc58fe #5974 10 11
dc24df83 #6002 10 11
07cd6c56 #6003 10 11

So fixing only dc24df83 leaves three red PRs underneath. Best to regenerate at the bottom (#5973 → 10) and let it flow up, regenerating again at #5974 where the count moves to 11.

Why it drifted — worth guarding against on the next reconcile

Bisecting the branch, it was in sync as late as dea570a2, then went stale across the "Reconcile … with current main" merges: at 6607ce9e the table came out at main's 9 while the tree had 10, i.e. the merge resolution took main's side of that line. The script's docstring is explicit that the table is generated and must not be hand-edited — that applies to merge conflict resolution too. So on the next reconcile, rather than resolving that line by hand, take either side and then re-run the generator. The two sidecars (aetherd-touchpoint-tags.json, aetherd-touchpoint-status.json) are the files meant to be edited by hand; they survive regeneration.

Unrelated

The accessibility bot's 2 findings are warnings only and don't block. No Copilot review comments on this PR.

Thanks for carrying this stack — the reconcile merges are doing real work, and a generated-counter drift is an easy thing for them to hide. 73


🤖 aethersdr-agent · cost: $7.2948 · model: claude-opus-5

@github-actions

github-actions Bot commented Oct 2, 2026

Copy link
Copy Markdown

Accessibility check findings

This PR touches src/gui/ files with 2 accessibility issue(s).
Full details appear as inline annotations on the diff above.

Files scanned : 13
Files with findings: 1
Total findings : 2

See docs/a11y.md for the canonical
Qt patterns (setAccessibleName, QAccessibleValueChangeEvent,
QAccessibleInterface subclasses, etc.). Structural remediation
(keyboard navigation, custom QAccessibleInterface subclasses)
is tracked in #3288.

Findings are warnings only — the build is not blocked.

@Ozy311 Ozy311 changed the title RTL: add opt-in native HD FM reception and local metadata RTL: add opt-in native digital broadcast reception and local metadata Oct 2, 2026
@Ozy311
Ozy311 force-pushed the codex/rtl-native-hd-fm branch from b6f87a9 to 2602312 Compare October 2, 2026 02:17
@github-actions

github-actions Bot commented Oct 2, 2026

Copy link
Copy Markdown

Accessibility check findings

This PR touches src/gui/ files with 17 accessibility issue(s).
Full details appear as inline annotations on the diff above.

Files scanned : 34
Files with findings: 5
Total findings : 17

See docs/a11y.md for the canonical
Qt patterns (setAccessibleName, QAccessibleValueChangeEvent,
QAccessibleInterface subclasses, etc.). Structural remediation
(keyboard navigation, custom QAccessibleInterface subclasses)
is tracked in #3288.

Findings are warnings only — the build is not blocked.

@Ozy311
Ozy311 changed the base branch from codex/rtl-wfm-filters-stereo to codex/rtl-multirx-delivery October 2, 2026 02:20
@github-actions

github-actions Bot commented Oct 2, 2026

Copy link
Copy Markdown

Accessibility check findings

This PR touches src/gui/ files with 2 accessibility issue(s).
Full details appear as inline annotations on the diff above.

Files scanned : 13
Files with findings: 1
Total findings : 2

See docs/a11y.md for the canonical
Qt patterns (setAccessibleName, QAccessibleValueChangeEvent,
QAccessibleInterface subclasses, etc.). Structural remediation
(keyboard navigation, custom QAccessibleInterface subclasses)
is tracked in #3288.

Findings are warnings only — the build is not blocked.

1 similar comment
@github-actions

github-actions Bot commented Oct 3, 2026

Copy link
Copy Markdown

Accessibility check findings

This PR touches src/gui/ files with 2 accessibility issue(s).
Full details appear as inline annotations on the diff above.

Files scanned : 13
Files with findings: 1
Total findings : 2

See docs/a11y.md for the canonical
Qt patterns (setAccessibleName, QAccessibleValueChangeEvent,
QAccessibleInterface subclasses, etc.). Structural remediation
(keyboard navigation, custom QAccessibleInterface subclasses)
is tracked in #3288.

Findings are warnings only — the build is not blocked.

@Ozy311
Ozy311 force-pushed the codex/rtl-multirx-delivery branch from e03365c to 50e2659 Compare October 6, 2026 01:53
@Ozy311
Ozy311 force-pushed the codex/rtl-native-hd-fm branch from 387e4e1 to ac62e47 Compare October 6, 2026 02:05
@github-actions

github-actions Bot commented Oct 6, 2026

Copy link
Copy Markdown

Accessibility check findings

This PR touches src/gui/ files with 2 accessibility issue(s).
Full details appear as inline annotations on the diff above.

Files scanned : 13
Files with findings: 1
Total findings : 2

See docs/a11y.md for the canonical
Qt patterns (setAccessibleName, QAccessibleValueChangeEvent,
QAccessibleInterface subclasses, etc.). Structural remediation
(keyboard navigation, custom QAccessibleInterface subclasses)
is tracked in #3288.

Findings are warnings only — the build is not blocked.

@Ozy311
Ozy311 force-pushed the codex/rtl-native-hd-fm branch from ac62e47 to 5ae6b20 Compare October 6, 2026 05:38
@Ozy311
Ozy311 force-pushed the codex/rtl-multirx-delivery branch from dd6be71 to ca3a36b Compare October 6, 2026 05:38
@github-actions

github-actions Bot commented Oct 6, 2026

Copy link
Copy Markdown

Accessibility check findings

This PR touches src/gui/ files with 2 accessibility issue(s).
Full details appear as inline annotations on the diff above.

Files scanned : 13
Files with findings: 1
Total findings : 2

See docs/a11y.md for the canonical
Qt patterns (setAccessibleName, QAccessibleValueChangeEvent,
QAccessibleInterface subclasses, etc.). Structural remediation
(keyboard navigation, custom QAccessibleInterface subclasses)
is tracked in #3288.

Findings are warnings only — the build is not blocked.

jensenpat pushed a commit that referenced this pull request Oct 7, 2026
…#5974)

## Rebased on current main — 2026-10-06

Current head: `ebb35cfd20892431758fd8a165b7c66357b74090`. Base stack
starts at main `5f09371e25ffc032666d36f0ea265dc506621066`; parent
PR/branch is unchanged. This is a signed replay of the existing
increment. It preserves main's unified window chrome and release
debug-symbol archives, alongside the RTL dependency packaging and
explicit Digital-OFF release flags. Generated touchpoint counts were
regenerated from the combined sources.

Fresh rebase validation on analog `ca3a36bd`: native Apple Silicon / Qt
6.12 / RTL required / Digital OFF application build succeeds. **51/52
selected CTests pass** in 226.55 seconds: all 47 RTL regressions and
four additional UI checks pass. The new upstream
`unified_title_bar_test` fails its Alt+F/menu-rounding assertions under
Mac offscreen rendering; an independent rebuild and run on clean main
`5f09371e` reproduces the identical two failures. This is an inherited
test failure, not a green full-suite claim. Static
engine/routing/capability, generated manifests,
registration/frozen-gate, theme and build-options checks pass;
package-helper tests pass 9/9 and required-RTL configuration checks pass
16 combinations. The Digital increment and vendor trees are unchanged by
replay; decoder-ON tests and release packaging were not rerun for these
heads. Hosted checks are being refreshed by the push.

All validation recorded below predates this rebase and remains evidence
for the specific revisions named there. No new live-RF, capacity, or
release-package qualification is claimed. Readiness is unchanged;
Digital #6002 remains draft.

---

## Previous checkpoint record — 2026-10-05

## Scope

Analog WFM backend and applet integration under RFC #5468, based on the
nine-file DSP foundation #5973 and main
`035a858356949a0c902e286ee5250c04f5ef86c0`.

Head: `b8aba26e677f49f07d155685e5f7bef8d2bfe425`. Parent: #5973. Digital
#6002 / RFC #6079 is not a dependency.

The selected RTL WFM receiver exposes Mono/Auto stereo, 50/75 µs
deemphasis, bandwidth and measured pilot/stereo diagnostics. Accepted
backend state drives readback and per-device persistence. The
`broadcastFmReceive` capability is documented for all six backend
families; RTL advertises the implemented controls and other families do
not.

WFM requests use the existing typed receive dispatcher through
`SliceWfmRequest` / `requestSliceWfm`, including thread, current
receiver identity, ownership, mode, value and backend-support guards.
Refusals use the shared reporting path. This carries the #5919
request-routing contract into WFM.

Speaker renegotiation prefers 48 kHz only for an accepted 48 kHz
producer. If opening the new sink fails, it makes one bounded attempt
using the previous rate policy and reports failure if neither opens.
Producer-domain buffers, DSP and rate state are preserved. This shared
AudioEngine behavior affects every backend family. The associated
recorder-rate test follows producer rate rather than inferring it from
the speaker sink.

The opt-in nonblocking WFM exchange uses eight slots: 42.667 ms total
exchange buffering, 32 ms above the legacy depth. Existing
blocking/legacy owners retain their prior depth. Vendored WDSP exchange
changes and test exports are included. Generic ContainerWidget managed
presentation is used by the WFM applet; the default WFM tile placement
applies to RTL.

## Validation and remaining decisions

Exact checkpoint, native Apple Silicon / Qt 6.12 / optional decoder OFF:
4/4 rebuilt tests pass in 17.10 seconds (`wfm_controls_test`,
`audio_engine_rates_test`, `fm_filter_controls_test`,
`rtl_model_acceptance_test`). Removing speaker recovery produces six
failures in the rate test; restored code passes. The regression injects
failed opens, checks bounded fallback and actual-rate stereo rendering,
and preserves producer/DSP/lifecycle state. Static ratchets and
generated manifests pass; independent source review found no remaining
typed-WFM routing defect.

Historical operator stability on `7601593f` is not a new-head soak. An
earlier Mac filter/stereo transition intermittently withdrew a WFM
receiver; passing diagnostic reruns did not establish a root cause, and
this remains unresolved.

Maintainer review still covers WFM applet/default presentation, the
typed public seam and vendor exchange/test surface, and the buffering
tradeoff. The approved RTL-only free-pan and confirmed-control seam from
#5924 are not reopened. Normal admission remains one receiver; 2/4/8
evaluation and capacity qualification belong to the delivery increment.
No Digital approval is requested.

Principles II, V/XIV and XI: accepted state, scoped persistence and
demonstrated behavior.

---
73, Ozy **K6OZY** · Codex
jensenpat added a commit that referenced this pull request Oct 7, 2026
…ge (#5973)

Lands the analog WFM work through #5974 on current main.

The DSP recipe accepts 384 kHz channel IQ, runs a Blackman-Harris RF
prefilter, decodes broadcast FM at 192 kHz, and produces paired 48 kHz
audio. Output gain holds headroom, deemphasis switches between 75 µs and
50 µs on the live filters, and a lock-free flag reports the stereo pilot
from the last decoded block. Channels that do not opt in keep their
previous recipe.

The RTL receiver wires that recipe through the typed receive path:
Mono/Auto stereo, deemphasis, bandwidth, and pilot readback, persisted
per device. RTL advertises `broadcastFmReceive`; the other families
declare the record and do not implement the controls. A WFM applet is
the RTL tile. The speaker path prefers 48 kHz for an accepted 48 kHz
producer and makes one bounded attempt at the previous rate if that open
fails. This path uses a non-blocking eight-slot WDSP exchange. Other
modes keep the previous exchange depth.

The second impulse blanker from main stays ahead of the WFM prefilter.
The touchpoint manifest was regenerated after the merge; its includer
counts were the only conflict.

Digital FM remains draft #6002.

Squashed-from: #5973
Co-authored-by: Ozy311 <6413560+Ozy311@users.noreply.github.com>

---------

Co-authored-by: jensenpat <patjensen@gmail.com>
Ozy311 added 9 commits October 9, 2026 15:45
Stage the pinned libusb required by librtlsdr before linuxdeploy, which excludes libusb by default. Reject missing or mismatched prefix libraries and copy through the runtime SONAME without a build-prefix symlink. Keep the existing RTL closure validator and run it in its own step before image creation.

Validate staging with injected ELF inspection reports and a real ELF closure/relocation fixture on Nobara. Mutation checks reject a removed SONAME guard and a build-prefix symlink. Current main already provides the full-suite disk cleanup and reduced debug information; preserve that workflow during integration.
Keep all Windows runtime closure cases active without requiring symlink privileges on Windows. Preserve the dependency search prefixes during the second linuxdeploy pass, preferring the already validated AppDir closure.
Remove the Digital FM placeholder option and release flags from the analog delivery. Retain mandatory RTL dependencies. Audit the extracted final AppImage after the final deployment pass, including its libusb payload. Document receive-only routing and the separate multi-receiver evaluation boundary.
Keep the optional decoder OFF in release and local packaging entry points. Document the opt-in toolchain and actual Digital controls in the user guide. Preserve decoder source pins, original upstream notices, internal identifiers and enabled-build behavior.
@Ozy311
Ozy311 force-pushed the codex/rtl-multirx-delivery branch from ca3a36b to a3458b0 Compare October 9, 2026 22:50
@Ozy311
Ozy311 force-pushed the codex/rtl-native-hd-fm branch from 5ae6b20 to a811237 Compare October 9, 2026 22:50
@github-actions

github-actions Bot commented Oct 9, 2026

Copy link
Copy Markdown

Accessibility check findings

This PR touches src/gui/ files with 2 accessibility issue(s).
Full details appear as inline annotations on the diff above.

Files scanned : 13
Files with findings: 1
Total findings : 2

See docs/a11y.md for the canonical
Qt patterns (setAccessibleName, QAccessibleValueChangeEvent,
QAccessibleInterface subclasses, etc.). Structural remediation
(keyboard navigation, custom QAccessibleInterface subclasses)
is tracked in #3288.

Findings are warnings only — the build is not blocked.

Base automatically changed from codex/rtl-multirx-delivery to main October 11, 2026 20:56
ten9876 added a commit that referenced this pull request Oct 11, 2026
Analog RTL receivers gain independent squelch, receive-audio exports,
meters and release packaging. This is the remaining analog delivery
increment under RFC #5468; the WFM foundation, applet and live PPM
changes are already in `main`.

## Scope and separation

Rebased onto main `d6f6a4f00e40e292d575c40cad7d0848406d89f5`. Only the
five remaining analog commits were replayed, followed by the
release-control and user-documentation cleanup. The merged WFM/PPM
changes and newer main changes are retained.

- Independent manual/Auto SQL; selected-receiver APRS; stable TCI
mapping; native Linux/macOS DAX receive feeds; relative receive meters
with a per-device switch; averaging preserved during monitor-volume
edits.
- WFM controls follow the selected receiver and reject stale bindings.
The normal launch remains **one receiver**. Explicit process-only 2/4/8
receiver evaluation remains separate from production capacity
qualification; no new Linux ARM capacity result is claimed.
- Official AppImage, macOS DMG and Windows packages require
`ENABLE_RTL=ON` and `REQUIRE_RTL=ON`. Configuration fails if RTL or
float-FFTW is missing. Jeremy [approved required RTL and bundling pinned
libusb](#6083 (comment)).
The completed AppImage is extracted and audited after the final
linuxdeploy pass, including a byte comparison of its libusb payload.
Windows dependency validation follows normal and delay imports
recursively.
- **No `ENABLE_HD_FM` declaration, placeholder, release flag or decoder
dependency remains in this analog increment.** The actual optional
switch and all explicit OFF release/build flags belong to deferred draft
#6002 / RFC #6079. That feature is not a prerequisite for this PR.
- User documentation now covers RTL packaging, evaluation limits,
squelch, meters, selected-slice AetherModem and receive-only DAX/TCI
routing.

## Shared behavior for review

Auto SQL uses the existing typed receive dispatcher and confirmed-state
guards. RTL's 2048-bin detector scale is relative dBFS, not calibrated
dBm or directly comparable with the display FFT; no misleading threshold
line is drawn. An accepted capture revision retires a receiver's
relative-level sample only when that receiver's detector input changes
(passband, mode, membership, front end, capture placement or DC
suppression); monitor gain, pan, mute and squelch edits keep it, so the
meter does not blank during an AF gain drag. Other adapters retain their
manual behavior and refuse the automatic request.

TCI initialization is batched as one worker job for every family.
`AETHER_SETTINGS_DIR` suppresses legacy-profile migration and normal log
pruning. The `activeSliceCommandIssued` connection uses
`receiveCommandSource()` identity and `Qt::DirectConnection`; this
shared-family guard remains part of the increment. Receive-only PipeWire
routing drains stale audio while preserving the legacy Flex FIFO's
sole-reader/EPIPE behavior. Dependency-prefix and Qt deployment fixes
remain in packaging.

## Validation

Native Nobara / GCC 16.2.1 / Qt 6.12 / Release application and daemon
builds pass at `a3458b09`. **53/53 selected CTests pass**, zero
skips/failures, 221.35 seconds. This covers RTL capture/control/receiver
banks, FM/WFM, SQL, spectrum/averaging, APRS, DAX/TCI, meters, applet
lifecycle and actual PipeWire FIFO behavior. The analog CMake cache
contains no Digital switch.

[Platform
CI](https://github.com/aethersdr/AetherSDR/actions/runs/38001349724)
passes on Linux, macOS and Windows. [Static
Checks](https://github.com/aethersdr/AetherSDR/actions/runs/38001349782)
and
[Docs](https://github.com/aethersdr/AetherSDR/actions/runs/38001349759)
pass.

[Full
Suite](https://github.com/aethersdr/AetherSDR/actions/runs/38001374779)
passes: **691 passed, five skipped, zero failures**, 696 registered
tests, 932.37 seconds. The skipped cases are four AppSettings safety
scenarios and `hl2_probe_spectrum_panadapter`; they are not claimed as
exercised.

All branch release-package workflows pass at exact head `a3458b09`:
[AppImage](https://github.com/aethersdr/AetherSDR/actions/runs/38001377190)
x86-64 and ARM, [macOS
DMG](https://github.com/aethersdr/AetherSDR/actions/runs/38001379572)
Apple Silicon and Intel, and [Windows
Installer](https://github.com/aethersdr/AetherSDR/actions/runs/38001382004).
Both completed AppImages pass RTL runtime closure and libusb byte
comparison. Both DMGs pass signing/notarization; Windows passes actual
DLL closure and installer/artifact packaging. Artifact identities and
checksums are retained. Release/Store publication jobs were skipped.

Already passed on this revision: 16 required-RTL configuration
combinations, 9 package-helper tests, engine/routing/capability gates,
generated manifests and references, frozen-test-gate and registration
checks, build-options checks, LogAnalyzer checks, and the
user-documentation production build. Commits are signed.

Historical operator multi-RX acceptance and earlier package/full-suite
results remain in the PR discussion and original #6077. They are not
substituted for this head's results. The intermittent historical Mac WFM
receiver withdrawal during a filter/stereo transition remains
unexplained; passing reruns did not establish a cause. No new live-RF,
audible, sanitizer or production-capacity qualification is claimed.

This PR requests its own maintainer/code-owner review. #6002 remains
draft. No release or Store publication is part of this validation.

---
73, Ozy **K6OZY** · Codex

---------

Co-authored-by: jensenpat <patjensen@gmail.com>
Co-authored-by: Jeremy [KK7GWY] <kk7gwy@aethersdr.com>
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
jensenpat added a commit that referenced this pull request Oct 17, 2026
…nciple II. (#6432)

## Summary

Adds the SSB/CW and AM/SAM receive increment of RFC #5468 through RTL's
existing shared capture, extractor and WDSP receiver bank. USB, LSB, CW,
CWR, AM and synchronous AM produce independent 48 kHz receiver audio.
Filter edits affect the passband; each mode recalls its last accepted
filter. Receiver AGC, blanking, noise reduction, notches, APF and RIT
publish and persist accepted state. CW pitch preserves the displayed RF
carrier, and explicit CW/AM tuning prefers a capture clear of converter
DC.

The selected receiver feeds CW decoding and Copy Assist before speaker
gain/mute. Retuning, parking and selection changes retire stale audio
and transcription results. The receive DSP capability record restricts
APF to CW/CWR. The receive pitch record enables pitch control without
granting TX. RTL retains the existing CWR mode token and scoped settings
document.

Includes the reported speaker-icon fix, fixed receive-only antenna
availability and Copy Assist teardown ordering. The shared
Connected-indicator correction ends discovery on a newly confirmed
connection, retains real link-loss alarms, and preserves rescans on
repeated connected-tab refreshes. Automation forwards the existing ANF
level argument; unsupported DSP-on requests are refused while cleanup
off intents remain allowed.

Uses existing DSP dependencies and threads. Normal receiver capacity
remains one; 2/4/8 are process-only evaluation settings. FM/FM-N/WFM
retain their recipes. Digital broadcast decoding remains in #6002 / RFC
#6079. This does not close the umbrella RFC.

## Integration and review

Rebased onto main `9dfe8f666775b51a6012534bff7e7737ff0412b1` as signed
commit `9df9135d197aadba5f1fefb20abdff4a71ac0241`, preserving Ozy311's
authorship. Keeps main's neural CW decoder integration, pitch slider,
passive DSP readback, transmit acknowledgement route, profile/memory
routing and settings consumers. The only final rebase conflict was
regenerated log-reference line numbers; the production/test patch is
unchanged. CW/CWR helpers use the existing model-layer
`ModeVocabulary.h` owner.

The operator requested review, rebase and merge of this proposed change.
The prior runtime-documentation, APF contract, automation cleanup,
rescan and pitch-confirmation findings are corrected in this head. No
workflow edits, CHANGELOG entry, frozen test-gate expansion or
boundary-baseline increase.

New GUI/model touchpoints consume existing selected-receiver models:
AsrAudioTap and CopyAssistController use DecoderAudioModel;
RadioModel/SliceModel observations provide selection and lifecycle
state. AudioButtonIcon shares the existing ThemeManager artwork. No new
vendor-header crossing or engine-to-GUI dependency.

## Validation

Current head `9df9135d1`:

- Native Apple Silicon app, daemon and 24 selected regression targets
built with Qt 6.12.0, ASR and RADE enabled. No RNNoise x86 sources in
the ARM build graph. The initial sandboxed iconutil failure cleared on
the unchanged permitted incremental build.
- **24/24 headless CTests pass**, 92.61 s: RTL AM/SAM, SSB/CW, FM/WFM
pipelines; model acceptance; capture transaction and scoped settings;
typed receive intents; ASR engine/native receiver/tap; capability
availability; DSP policy; filters; TNF removal; title bar; Phone/CW APF
and accepted pitch; CW mode gates; current-main CW RX model and
stored-control routing/dialog regressions.
- Integration mutation on `2e4996250` (unchanged helper and test on the
final head): omitting CWR from the shared mode vocabulary causes four CW
mode-gate failures; the exact current source passes. No production
source was altered for the isolated mutation.
- Isolated offscreen bridge instance `pr6432-final-20261017`, PID 10312,
explicit socket, fresh settings and autoconnect disabled: only DEMO-0001
connected; `whoami` reported `txAllowed:false`, radio state reported
`transmitting:false`. Confirmed USB/CW/USB Copy Assist menu and panel
transitions, slice mute readback, reconnect and window shutdown. Copy
Assist destruction logged `result=ok elapsed_ms=0`; the owned process
exited with code 0.
- Engine boundary, touchpoint manifest, capability freeze and
command-plane gates pass on main and the head. Same 101 tracked boundary
findings, 70 capability booleans and 221 above-seam command strings.
Test registration, frozen test gate, seam probe generation, WDSP test
links, QSettings, bridge-doc and generated reference/log-rule checks
pass. Accessibility warnings match main: 19, with no additions.
- Exact-head hosted platform, Static checks, CodeQL and Docs results are
recorded in this PR’s Checks tab. Required checks gate the protected
merge. The preceding `2e4996250` head passed all hosted checks; that
evidence is scoped to that head.

Earlier operator validation on the pre-rebase candidates confirmed USB,
LSB, CW, AM/SAM reception and CW decoding with an IC-705 signal source,
plus ASR on the SSB/CW candidate. Earlier explicit-fixture Whisper
inference on demodulated AM/SAM speech produced nonempty transcripts.
These are retained historical evidence, not new live RF or inference
runs for the rebased head.

## Limits

The demo does not exercise RTL USB capture or real SAM acquisition.
Current local evidence is generated-IQ production-pipeline testing and
shared demo UI behavior. No new live hardware, TX, instrumented RF
sensitivity/distortion, portable macOS packaging, transcription accuracy
or sustained eight-receiver qualification is claimed. SAM retains the
existing ±2 kHz PLL bound; large carrier changes may require retuning.
AM/SAM squelch is unavailable; APF is CW-only.

Generated with OpenAI Codex (GPT-6 Astra)

Co-authored-by: jensenpat <patjensen@gmail.com>
@aethersdr-agent

Copy link
Copy Markdown
Contributor

Welcome to AetherSDR, @Ozy311! Thanks for your first pull request.

A few things that might help:

  • Our CONTRIBUTING.md covers coding conventions and the PR process
  • CI will run automatically — if it fails, I'll post a comment explaining what went wrong
  • Jeremy (KK7GWY) reviews all PRs before merge
  • Come say hello on the AetherSDR Discord — most of the community hangs out there, and merged contributors get the Contributors role

If you have questions, feel free to ask here or in Discussions.

— AetherClaude (automated agent for AetherSDR)


🤖 aethersdr-agent · cost: $34.5922 · model: claude-opus-5

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants