Skip to content

fix(audio): default client TX final limiter to off so AetherSDR matches SmartSDR drive level#3004

Merged
ten9876 merged 1 commit into
mainfrom
auto/fixaudio-default-client-TX-final-limiter-to-off-so
May 23, 2026
Merged

fix(audio): default client TX final limiter to off so AetherSDR matches SmartSDR drive level#3004
ten9876 merged 1 commit into
mainfrom
auto/fixaudio-default-client-TX-final-limiter-to-off-so

Conversation

@ten9876

@ten9876 ten9876 commented May 23, 2026

Copy link
Copy Markdown
Collaborator

The ClientFinalLimiter at the tail of the PC mic voice TX chain has
been enabled-by-default with a -1.0 dBFS ceiling. SmartSDR has no
equivalent client-side brickwall — it sends mic audio essentially raw
and lets the radio's SW ALC set the working point off the natural
voice peaks.

The mismatch shows up as 'less forward power from AetherSDR than from
SmartSDR' on user reports: peaks above -1 dBFS get pulled down before
the radio sees them, the radio's SC_MIC (#26) reads ~1 dB lower than
SmartSDR's, SW ALC works off a lower reference, and average drive
falls accordingly.

Default the limiter to off so a fresh install matches SmartSDR's
drive level. Users who want headroom protection — most relevant when
running hot Comp/Tube/PUDU/Reverb on the AetherialAudio chain — can
still flip LIM on in the Aetherial Final Output Stage panel at the
bottom of the channel strip. Existing users whose setting was already
persisted keep their previous behavior unchanged (AppSettings::value
returns the persisted value, not the new default).

DAX/TCI and RADE TX paths were already bypassing the limiter, so
digital-mode drive is unaffected by this change.

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

…es SmartSDR drive level

The ClientFinalLimiter at the tail of the PC mic voice TX chain has
been enabled-by-default with a -1.0 dBFS ceiling. SmartSDR has no
equivalent client-side brickwall — it sends mic audio essentially raw
and lets the radio's SW ALC set the working point off the natural
voice peaks.

The mismatch shows up as 'less forward power from AetherSDR than from
SmartSDR' on user reports: peaks above -1 dBFS get pulled down before
the radio sees them, the radio's SC_MIC (#26) reads ~1 dB lower than
SmartSDR's, SW ALC works off a lower reference, and average drive
falls accordingly.

Default the limiter to off so a fresh install matches SmartSDR's
drive level. Users who want headroom protection — most relevant when
running hot Comp/Tube/PUDU/Reverb on the AetherialAudio chain — can
still flip LIM on in the Aetherial Final Output Stage panel at the
bottom of the channel strip. Existing users whose setting was already
persisted keep their previous behavior unchanged (AppSettings::value
returns the persisted value, not the new default).

DAX/TCI and RADE TX paths were already bypassing the limiter, so
digital-mode drive is unaffected by this change.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@ten9876 ten9876 requested a review from jensenpat as a code owner May 23, 2026 15:41
@ten9876 ten9876 enabled auto-merge (squash) May 23, 2026 15:41

@aethersdr-agent aethersdr-agent Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good — a clean one-line default flip with a clear Why: comment explaining the SmartSDR parity goal.

Verified the reasoning against the code:

  • AppSettings::value("ClientFinalLimiterTxEnabled", ...) only consults the default when the key is missing, so persisted users keep their setting — no migration needed.
  • StripFinalOutputPanel.cpp:647 initializes the LIM checkbox from lim->isEnabled() after loadClientFinalLimiterSettings() runs, so the UI on a fresh install will correctly show LIM off and the OFF state will persist on first save.
  • DAX/TCI and RADE TX paths already bypass m_clientFinalLimiterTx, so digital-mode drive is unaffected as claimed.
  • ClientFinalLimiter's in-memory atomic still defaults to enabled=true at construction, but that's only relevant before loadClientFinalLimiterSettings() runs — the load step authoritatively sets state from settings, so no audio is processed with the wrong state.

Nice catch on the SC_MIC #26 reference correlating with the ~1 dB drive delta — that's the kind of measurable evidence that makes a default change defensible. Thanks @ten9876.


🤖 aethersdr-agent · cost: $4.0990 · model: claude-opus-4-7

@ten9876 ten9876 merged commit 49649c5 into main May 23, 2026
5 checks passed
@ten9876 ten9876 deleted the auto/fixaudio-default-client-TX-final-limiter-to-off-so branch May 23, 2026 17:38
G6PWY-Chris pushed a commit to G6PWY-Chris/AetherSDR that referenced this pull request Jun 22, 2026
…es SmartSDR drive level (aethersdr#3004)

The ClientFinalLimiter at the tail of the PC mic voice TX chain has
been enabled-by-default with a -1.0 dBFS ceiling. SmartSDR has no
equivalent client-side brickwall — it sends mic audio essentially raw
and lets the radio's SW ALC set the working point off the natural
voice peaks.

The mismatch shows up as 'less forward power from AetherSDR than from
SmartSDR' on user reports: peaks above -1 dBFS get pulled down before
the radio sees them, the radio's SC_MIC (aethersdr#26) reads ~1 dB lower than
SmartSDR's, SW ALC works off a lower reference, and average drive
falls accordingly.

Default the limiter to off so a fresh install matches SmartSDR's
drive level. Users who want headroom protection — most relevant when
running hot Comp/Tube/PUDU/Reverb on the AetherialAudio chain — can
still flip LIM on in the Aetherial Final Output Stage panel at the
bottom of the channel strip. Existing users whose setting was already
persisted keep their previous behavior unchanged (AppSettings::value
returns the persisted value, not the new default).

DAX/TCI and RADE TX paths were already bypassing the limiter, so
digital-mode drive is unaffected by this change.

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