Skip to content

feat(audio): RN2 (RNNoise) toggle on Aetherial Tube Pre-Amp TX (#2813)#2816

Merged
ten9876 merged 1 commit into
mainfrom
auto/feataudio-RN2-RNNoise-toggle-on-Aetherial-Tube-Pre
May 17, 2026
Merged

feat(audio): RN2 (RNNoise) toggle on Aetherial Tube Pre-Amp TX (#2813)#2816
ten9876 merged 1 commit into
mainfrom
auto/feataudio-RN2-RNNoise-toggle-on-Aetherial-Tube-Pre

Conversation

@ten9876

@ten9876 ten9876 commented May 17, 2026

Copy link
Copy Markdown
Collaborator

Adds a TX-side neural denoiser toggle to the Aetherial Audio Channel
Strip mic pre-amp area. Operators with noisy shacks (HVAC, fan,
keyboard, kids, HF QRM bleeding into the mic) can now denoise their
mic at the input — before any gate / compressor / EQ / saturator can
amplify the noise floor.

Architecture:

  • New atomic m_rn2TxEnabled + std::unique_ptr m_rn2Tx
    in AudioEngine, lazy-allocated under m_dspMutex on toggle-on,
    freed on toggle-off. Mirrors the existing RX RN2 ownership.
  • Hook in onTxAudioReady() lives AFTER the m_radeMode and
    m_daxTxMode early-returns, so RN2 is structurally guaranteed
    never to touch digital-mode TX paths (RADE / DAX / TCI /
    RTTY / FT8 / FDV). Voice modes only.
  • RNNoiseFilter::process() actually takes float32 stereo (the
    pre-existing header comment claiming int16 was wrong — also
    fixed in this commit so the next developer doesn't get burned).
    The hook converts int16 → float32 into a pre-sized scratch
    buffer, processes, converts back to int16 with saturation.
    No per-block heap allocation after first frame.

UI:

  • StripTubePanel now hosts a small RN2 toggle in its meter column,
    sized 22x20 to match the existing A/B/C model buttons and styled
    with kModelStyle so all four compact buttons share one idiom.
  • StripTubePanel is dual-side (TX + RX strip instances + standalone
    editor). The toggle is created hidden in the ctor; showForTx()
    flips it visible, showForRx() keeps it hidden. RX side already
    has its own RN2 toggle elsewhere (AetherDspWidget); no duplication.
  • Meter retains its default Expanding height policy; the toggle
    sits flush at the bottom of the column with the meter absorbing
    all surplus space (stretch=1 vs stretch=0).

Persistence (Principle V):

  • New AppSettings key "AetherialTubePreampTx" holds a JSON object:
    {"rn2": bool}. Nested shape leaves room for future mic-preamp
    toggles (high-pass, phase invert, polarity) without further
    migration.

No mutual-exclusion with other TX-side NR: AetherSDR has no other
neural denoiser on the TX mic path today (NR2/NR4/BNR/DFNR/MNR are
RX-only), so RN2 TX is the sole TX-side NR and needs no exclusion
logic. If a second TX denoiser lands later, the pattern's there to
extend.

Co-Authored-By: Claude Opus 4.7 (1M context) noreply@anthropic.com

Adds a TX-side neural denoiser toggle to the Aetherial Audio Channel
Strip mic pre-amp area.  Operators with noisy shacks (HVAC, fan,
keyboard, kids, HF QRM bleeding into the mic) can now denoise their
mic at the input — before any gate / compressor / EQ / saturator can
amplify the noise floor.

Architecture:
  - New atomic m_rn2TxEnabled + std::unique_ptr<RNNoiseFilter> m_rn2Tx
    in AudioEngine, lazy-allocated under m_dspMutex on toggle-on,
    freed on toggle-off.  Mirrors the existing RX RN2 ownership.
  - Hook in onTxAudioReady() lives AFTER the m_radeMode and
    m_daxTxMode early-returns, so RN2 is structurally guaranteed
    never to touch digital-mode TX paths (RADE / DAX / TCI /
    RTTY / FT8 / FDV).  Voice modes only.
  - RNNoiseFilter::process() actually takes float32 stereo (the
    pre-existing header comment claiming int16 was wrong — also
    fixed in this commit so the next developer doesn't get burned).
    The hook converts int16 → float32 into a pre-sized scratch
    buffer, processes, converts back to int16 with saturation.
    No per-block heap allocation after first frame.

UI:
  - StripTubePanel now hosts a small RN2 toggle in its meter column,
    sized 22x20 to match the existing A/B/C model buttons and styled
    with kModelStyle so all four compact buttons share one idiom.
  - StripTubePanel is dual-side (TX + RX strip instances + standalone
    editor).  The toggle is created hidden in the ctor; showForTx()
    flips it visible, showForRx() keeps it hidden.  RX side already
    has its own RN2 toggle elsewhere (AetherDspWidget); no duplication.
  - Meter retains its default Expanding height policy; the toggle
    sits flush at the bottom of the column with the meter absorbing
    all surplus space (stretch=1 vs stretch=0).

Persistence (Principle V):
  - New AppSettings key "AetherialTubePreampTx" holds a JSON object:
    {"rn2": bool}.  Nested shape leaves room for future mic-preamp
    toggles (high-pass, phase invert, polarity) without further
    migration.

No mutual-exclusion with other TX-side NR: AetherSDR has no other
neural denoiser on the TX mic path today (NR2/NR4/BNR/DFNR/MNR are
RX-only), so RN2 TX is the sole TX-side NR and needs no exclusion
logic.  If a second TX denoiser lands later, the pattern's there to
extend.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@ten9876 ten9876 requested a review from jensenpat as a code owner May 17, 2026 17:48
@ten9876 ten9876 enabled auto-merge (squash) May 17, 2026 17:48
@ten9876 ten9876 merged commit 7a37b9d into main May 17, 2026
4 checks passed
@ten9876 ten9876 deleted the auto/feataudio-RN2-RNNoise-toggle-on-Aetherial-Tube-Pre branch May 17, 2026 17:56
ten9876 added a commit that referenced this pull request May 22, 2026
… Principle XIII. (#2932)

Restructures AetherSDR's contributor-onboarding documentation around
the project's actual multi-agent contribution model: at least six
distinct AI tools touch the codebase (AetherClaude orchestrator,
Claude Code, OpenAI Codex, GPT 5.5 Pro, GitHub Copilot, contributor-
side IDE agents). Each tool has its own well-known file at a
different path, and the previous topology (CLAUDE.md as the sole
canonical) left every other agent reading conventions by accident.

Changes:

- AGENTS.md (new): canonical project guide. All previous CLAUDE.md
  content moved here, retitled to be agent-neutral. Single source of
  truth for project-wide guidance.
- CLAUDE.md: slimmed 311 → 68 lines. Now a thin pointer to AGENTS.md
  plus Claude-Code-specific notes (git ship alias, ~/.claude paths).
- GEMINI.md (new): thin pointer for Gemini Code Assist with 6 inline
  must-knows.
- .github/copilot-instructions.md (new): same pattern for GitHub
  Copilot.
- All tool-specific files point directly to AGENTS.md — no
  pointer-to-pointer chains.

Constitution v1.0.1 → 1.1.0 (MINOR amendment):

- Adopts 7 new principles from Cisco's Foundry Constitution
  (https://github.com/CiscoDevNet/foundry-security-spec):
  VIII Evidence Over Assertion, IX Surface Only What Survives,
  X Claims Are Atomic And Mortal, XI Fixes Are Demonstrated,
  XII Sandbox By Infrastructure Not By Prompt,
  XIII The Operator Outranks Every Agent (promoted from Governance),
  XIV Persist Atomically.
- Total principle count: 7 → 14. First 7 unchanged (AetherSDR-
  domain conventions); last 7 codify defensive engineering for the
  multi-agent contribution model.
- CONSTITUTION.md (new): byte-identical root mirror of
  .specify/memory/constitution.md so AI tools reading the repo
  root find it without spec-kit path knowledge.
- Each new principle is grounded in a real AetherSDR incident
  (PR #2780 stale-snapshot revert → Principle X; PR #2816 alloc-
  free claim verification → Principle VIII; etc.).

New: Issue / PR Claim Protocol (AGENTS.md):

- AI agents reviewing/commenting on or merging PRs must assign
  themselves via gh issue edit / gh pr edit --add-assignee @me.
- Carve-out: AetherClaude (@aethersdr-agent) auto-triages every
  new issue/PR, so adding yourself alongside its assignment is
  expected — only avoid double-assigning when another non-AetherClaude
  agent is already engaged.
- Operational implementation of Principle X (Claims Are Atomic And
  Mortal): assignees list is the visible cross-agent claim signal.

New: docs/COMMIT-SIGNING.md:

- Walks contributors through SSH or GPG signing setup on Windows /
  macOS / Linux / WSL / Raspberry Pi.
- Top of doc has explicit AI Assistant Instructions section so an
  agent pointed at the doc can walk the contributor through setup
  in their actual environment without further prompting.
- Per-OS copy-paste prompts also included for contributors using AI
  IDEs (Claude Code, Cursor, Copilot chat, ChatGPT) who want a
  ready-made invocation.

Updated: CONTRIBUTING.md + CLAUDE.md / AGENTS.md pointers:

- Constitution reference promoted to step 2 in the Submitting Code
  checklist.
- Commit signing section rewritten to lead with the new doc and
  AI-assistant invocation, with SSH quick-reference inline.
- Principle counts updated everywhere (7 → 14).

Principle XIII (Operator Outranks Every Agent) is cited because
the entire restructure exists to ensure the operator's authoritative
voice reaches every agent reading the project, regardless of which
tool the agent runs as.

Foundry-spec conformance verified: all 14 structural elements
(SYNC IMPACT REPORT, Field table, Purpose, Core Principles, "Why
inviolable" rationales, Governance subsections Amendment/Precedence/
Scope/Versioning/Compliance review/Downstream artifacts, MAJOR/MINOR/
PATCH versioning, Foundry reference) present in CONSTITUTION.md.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
G6PWY-Chris pushed a commit to G6PWY-Chris/AetherSDR that referenced this pull request Jun 22, 2026
… Principle XIII. (aethersdr#2932)

Restructures AetherSDR's contributor-onboarding documentation around
the project's actual multi-agent contribution model: at least six
distinct AI tools touch the codebase (AetherClaude orchestrator,
Claude Code, OpenAI Codex, GPT 5.5 Pro, GitHub Copilot, contributor-
side IDE agents). Each tool has its own well-known file at a
different path, and the previous topology (CLAUDE.md as the sole
canonical) left every other agent reading conventions by accident.

Changes:

- AGENTS.md (new): canonical project guide. All previous CLAUDE.md
  content moved here, retitled to be agent-neutral. Single source of
  truth for project-wide guidance.
- CLAUDE.md: slimmed 311 → 68 lines. Now a thin pointer to AGENTS.md
  plus Claude-Code-specific notes (git ship alias, ~/.claude paths).
- GEMINI.md (new): thin pointer for Gemini Code Assist with 6 inline
  must-knows.
- .github/copilot-instructions.md (new): same pattern for GitHub
  Copilot.
- All tool-specific files point directly to AGENTS.md — no
  pointer-to-pointer chains.

Constitution v1.0.1 → 1.1.0 (MINOR amendment):

- Adopts 7 new principles from Cisco's Foundry Constitution
  (https://github.com/CiscoDevNet/foundry-security-spec):
  VIII Evidence Over Assertion, IX Surface Only What Survives,
  X Claims Are Atomic And Mortal, XI Fixes Are Demonstrated,
  XII Sandbox By Infrastructure Not By Prompt,
  XIII The Operator Outranks Every Agent (promoted from Governance),
  XIV Persist Atomically.
- Total principle count: 7 → 14. First 7 unchanged (AetherSDR-
  domain conventions); last 7 codify defensive engineering for the
  multi-agent contribution model.
- CONSTITUTION.md (new): byte-identical root mirror of
  .specify/memory/constitution.md so AI tools reading the repo
  root find it without spec-kit path knowledge.
- Each new principle is grounded in a real AetherSDR incident
  (PR aethersdr#2780 stale-snapshot revert → Principle X; PR aethersdr#2816 alloc-
  free claim verification → Principle VIII; etc.).

New: Issue / PR Claim Protocol (AGENTS.md):

- AI agents reviewing/commenting on or merging PRs must assign
  themselves via gh issue edit / gh pr edit --add-assignee @me.
- Carve-out: AetherClaude (@aethersdr-agent) auto-triages every
  new issue/PR, so adding yourself alongside its assignment is
  expected — only avoid double-assigning when another non-AetherClaude
  agent is already engaged.
- Operational implementation of Principle X (Claims Are Atomic And
  Mortal): assignees list is the visible cross-agent claim signal.

New: docs/COMMIT-SIGNING.md:

- Walks contributors through SSH or GPG signing setup on Windows /
  macOS / Linux / WSL / Raspberry Pi.
- Top of doc has explicit AI Assistant Instructions section so an
  agent pointed at the doc can walk the contributor through setup
  in their actual environment without further prompting.
- Per-OS copy-paste prompts also included for contributors using AI
  IDEs (Claude Code, Cursor, Copilot chat, ChatGPT) who want a
  ready-made invocation.

Updated: CONTRIBUTING.md + CLAUDE.md / AGENTS.md pointers:

- Constitution reference promoted to step 2 in the Submitting Code
  checklist.
- Commit signing section rewritten to lead with the new doc and
  AI-assistant invocation, with SSH quick-reference inline.
- Principle counts updated everywhere (7 → 14).

Principle XIII (Operator Outranks Every Agent) is cited because
the entire restructure exists to ensure the operator's authoritative
voice reaches every agent reading the project, regardless of which
tool the agent runs as.

Foundry-spec conformance verified: all 14 structural elements
(SYNC IMPACT REPORT, Field table, Purpose, Core Principles, "Why
inviolable" rationales, Governance subsections Amendment/Precedence/
Scope/Versioning/Compliance review/Downstream artifacts, MAJOR/MINOR/
PATCH versioning, Foundry reference) present in CONSTITUTION.md.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant