Skip to content

fix(dax): don't toggle radio dax flag on Windows from slice-mode changes (#2315). Principle I.#2670

Merged
aethersdr-agent[bot] merged 1 commit into
mainfrom
aetherclaude/issue-2315
May 14, 2026
Merged

fix(dax): don't toggle radio dax flag on Windows from slice-mode changes (#2315). Principle I.#2670
aethersdr-agent[bot] merged 1 commit into
mainfrom
aetherclaude/issue-2315

Conversation

@aethersdr-agent

Copy link
Copy Markdown
Contributor

Summary

Fixes #2315

What was changed

fix(dax): don't toggle radio dax flag on Windows from slice-mode changes (#2315). Principle I.

Files modified

  • src/gui/MainWindow.cpp
 src/gui/MainWindow.cpp | 35 +++++++++++++++++++++--------------
 1 file changed, 21 insertions(+), 14 deletions(-)

Generated by AetherClaude (automated agent for AetherSDR)

…ges (#2315). Principle I.

When the TX slice's mode changed (e.g. band-stack restore flipping DIGU back
to USB on a band switch), updateDaxTxMode() sent `transmit set dax=0|1` on
every platform — including Windows. On Windows, SmartSDR DAX2 owns both
the radio's `dax_tx` stream and the `transmit dax` flag, and AetherSDR
fighting that on every mode transition parks DAX2's TX Stream in Busy
until the user re-arms it from the DAX2 window — silently breaking
digital TX (FT8/FT4/etc.) even though the radio keys.

Drop Windows from the setDax conditional so AetherSDR only manages the
`transmit dax` flag on hosted-DAX platforms (macOS / PipeWire) where it
actually owns the audio feed. On Windows, leave the flag to DAX2 — this
matches SmartSDR Console's behavior. The Windows ExternalDaxRouteOnly
ensureDaxTxStream call was already short-circuited by DaxTxPolicy, so
this completes the coexistence story for the v0.9.5 stabilization (#2271).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@jensenpat

Copy link
Copy Markdown
Collaborator

Tested FT8 and Winlink and working perfectly on Windows with band switches on 15m, 20m, and 40m.

@ten9876 ten9876 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Approved. Diagnosis is sound (DAX2 owns the dax flag on Windows; AetherSDR's per-slice-mode toggle parks DAX2's stream as Busy during band-stack mode transitions). Fix correctly carves Windows out of the dax-flag-toggling business. FlexLib citation verified at Radio.cs:9904 — flag is radio-wide and shared between clients.

@aethersdr-agent aethersdr-agent Bot merged commit 9fb1c9b into main May 14, 2026
5 checks passed
@aethersdr-agent aethersdr-agent Bot deleted the aetherclaude/issue-2315 branch May 14, 2026 22:28
ten9876 added a commit that referenced this pull request May 24, 2026
## Summary

- Adds `src/gui/MainWindow.cpp` and `src/gui/MainWindow.h` to the
`dorny/paths-filter` `build` group so the Windows CI job runs whenever
the hot file changes.
- The file is densely platform-guarded (`#ifdef Q_OS_WIN`, `Q_OS_MAC`,
`HAVE_PIPEWIRE`), so Linux-passing edits can still break MSVC.

## Motivation

Same class of failure has bitten us repeatedly:
- **#2633#2662** — unconditional `m_daxBridge` reference inside a
macOS-only guard, caught post-release.
- **#2670** — Windows behaviour change not exercised by CI.
- **v26.5.3 (#3024)** — `ClientPhaseRotator.cpp` bare `M_PI` broke MSVC
(needs `_USE_MATH_DEFINES`). Different file, same shape: path not on the
filter → `check-windows` didn't run → broken Windows build landed and
required a follow-up patch.

This PR closes the gap for the highest-leverage file. Other hot
platform-guarded files can be added later if their breakage rate
justifies the runner time.

## Cost

Most PRs continue to skip `check-windows` (the filter still excludes
most source paths). Cost increase is bounded to the subset of PRs that
touch MainWindow.cpp/.h, which is exactly the subset that needs the
coverage.

## Test plan

- [ ] CI: `check-paths` job runs and reports `build-changed=true` on
this PR (because `.github/workflows/**` is itself a watched path).
- [ ] CI: `check-windows` job runs and passes (no source changed, so it
should be a clean cache hit).
- [ ] After merge: next PR that touches `src/gui/MainWindow.cpp`
triggers `check-windows` automatically.

Closes #2671.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
ten9876 added a commit that referenced this pull request May 28, 2026
## Summary

Drop the \`check-paths\` allow-list job that gated \`check-windows\` and
\`check-macos\` based on a hand-maintained set of files. Both
cross-platform CI builds now run on every PR.

## Why

The path-filter approach has been a chronic leaker. Every time a new
file gained a platform-guarded branch (\`#ifdef Q_OS_WIN\`, \`#ifdef
Q_OS_MAC\`, \`HAVE_PIPEWIRE\`, etc.) that wasn't on the allow-list, CI
silently skipped the relevant cross-platform check and the regression
surfaced at release tag time. The follow-up was always to add another
path to the filter — and then the same class of issue would resurface
elsewhere a few PRs later.

Pattern receipts:
- #796 — original \"MSVC issue slipped past CI\" lesson
- #2633#2662 — macOS \`m_daxBridge\` reference inside macOS-only
guard, missed
- #2670 — Windows behavior change not exercised by CI
- #2671 — added MainWindow.cpp/.h to filter after a miss
- #2929#3052 — WASAPI mono-mic recovery landed unverified; added
AudioEngine.cpp/.h
- #3210 — re-added AudioEngine after a relapse
- v26.5.3 — ClientPhaseRotator.cpp \`M_PI\` MSVC break slipped through
- #3241 (yesterday) — CwSidetonePortAudioSink WASAPI fix; entire
\`#ifdef Q_OS_WIN\` block never compiled by CI because the file wasn't
on the filter

## Trade-off

Cost: ~15-20 min of GitHub Actions runner time per PR (Windows + macOS
in parallel, both cached aggressively — cold ~5 min, warm ~2-3 min).

Benefit: a whole class of release-time regression we've been paying for
repeatedly.

## Test plan

- [x] YAML valid (\`python3 -c 'import yaml; yaml.safe_load(...)'\`)
- [ ] Confirm \`check-windows\` and \`check-macos\` actually run on this
PR (no longer marked \`skipping\`)
- [ ] Both pass

🤖 Generated with [Claude Code](https://claude.com/claude-code)

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
… (aethersdr#3028)

## Summary

- Adds `src/gui/MainWindow.cpp` and `src/gui/MainWindow.h` to the
`dorny/paths-filter` `build` group so the Windows CI job runs whenever
the hot file changes.
- The file is densely platform-guarded (`#ifdef Q_OS_WIN`, `Q_OS_MAC`,
`HAVE_PIPEWIRE`), so Linux-passing edits can still break MSVC.

## Motivation

Same class of failure has bitten us repeatedly:
- **aethersdr#2633aethersdr#2662** — unconditional `m_daxBridge` reference inside a
macOS-only guard, caught post-release.
- **aethersdr#2670** — Windows behaviour change not exercised by CI.
- **v26.5.3 (aethersdr#3024)** — `ClientPhaseRotator.cpp` bare `M_PI` broke MSVC
(needs `_USE_MATH_DEFINES`). Different file, same shape: path not on the
filter → `check-windows` didn't run → broken Windows build landed and
required a follow-up patch.

This PR closes the gap for the highest-leverage file. Other hot
platform-guarded files can be added later if their breakage rate
justifies the runner time.

## Cost

Most PRs continue to skip `check-windows` (the filter still excludes
most source paths). Cost increase is bounded to the subset of PRs that
touch MainWindow.cpp/.h, which is exactly the subset that needs the
coverage.

## Test plan

- [ ] CI: `check-paths` job runs and reports `build-changed=true` on
this PR (because `.github/workflows/**` is itself a watched path).
- [ ] CI: `check-windows` job runs and passes (no source changed, so it
should be a clean cache hit).
- [ ] After merge: next PR that touches `src/gui/MainWindow.cpp`
triggers `check-windows` automatically.

Closes aethersdr#2671.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

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
## Summary

Drop the \`check-paths\` allow-list job that gated \`check-windows\` and
\`check-macos\` based on a hand-maintained set of files. Both
cross-platform CI builds now run on every PR.

## Why

The path-filter approach has been a chronic leaker. Every time a new
file gained a platform-guarded branch (\`#ifdef Q_OS_WIN\`, \`#ifdef
Q_OS_MAC\`, \`HAVE_PIPEWIRE\`, etc.) that wasn't on the allow-list, CI
silently skipped the relevant cross-platform check and the regression
surfaced at release tag time. The follow-up was always to add another
path to the filter — and then the same class of issue would resurface
elsewhere a few PRs later.

Pattern receipts:
- aethersdr#796 — original \"MSVC issue slipped past CI\" lesson
- aethersdr#2633aethersdr#2662 — macOS \`m_daxBridge\` reference inside macOS-only
guard, missed
- aethersdr#2670 — Windows behavior change not exercised by CI
- aethersdr#2671 — added MainWindow.cpp/.h to filter after a miss
- aethersdr#2929aethersdr#3052 — WASAPI mono-mic recovery landed unverified; added
AudioEngine.cpp/.h
- aethersdr#3210 — re-added AudioEngine after a relapse
- v26.5.3 — ClientPhaseRotator.cpp \`M_PI\` MSVC break slipped through
- aethersdr#3241 (yesterday) — CwSidetonePortAudioSink WASAPI fix; entire
\`#ifdef Q_OS_WIN\` block never compiled by CI because the file wasn't
on the filter

## Trade-off

Cost: ~15-20 min of GitHub Actions runner time per PR (Windows + macOS
in parallel, both cached aggressively — cold ~5 min, warm ~2-3 min).

Benefit: a whole class of release-time regression we've been paying for
repeatedly.

## Test plan

- [x] YAML valid (\`python3 -c 'import yaml; yaml.safe_load(...)'\`)
- [ ] Confirm \`check-windows\` and \`check-macos\` actually run on this
PR (no longer marked \`skipping\`)
- [ ] Both pass

🤖 Generated with [Claude Code](https://claude.com/claude-code)

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

priority: high High priority

Projects

None yet

Development

Successfully merging this pull request may close these issues.

When switching bands and running the DAX2 new version, the DAX TX Stream shows busy.

2 participants