Background
Follow-up to #2271 (DAX2 coexistence policy). The new policy intentionally never creates a local `dax_tx` stream on Linux non-PipeWire builds (the `HostedDaxBridge` request requires `HAVE_PIPEWIRE` or `Q_OS_MAC`; `ExternalDaxRouteOnly` always returns `{false, route_only_does_not_require_local_stream}`).
However, `MainWindow.cpp:7491` now sends `transmit set dax=1` unconditionally for digital modes on all platforms, not just hosted-DAX ones. So on Linux non-PipeWire:
- User switches active TX slice to a digital mode (DIGU, DIGL, RTTY, FreeDV, …)
- We send `transmit set dax=1` → radio expects DAX TX audio
- Policy says no local `dax_tx` stream → AetherSDR sends nothing
- Result: silent digital TX
Pre-#2271, the `setDax(isDigital)` call was inside `#if defined(Q_OS_MAC) || defined(HAVE_PIPEWIRE)`, so Linux non-PipeWire users left the radio's `dax` flag in whatever state the radio had (typically 0). Net effect: digital TX used the radio's mic input. After #2271, digital TX uses DAX which is empty → silence.
Affected user segment
Linux users without PipeWire support (no `HAVE_PIPEWIRE` build flag) AND without alternate DAX routing. In practice this is a niche of a niche — these users typically can't do digital TX through AetherSDR at all today, so the regression may be theoretical. But the behaviour change is real.
Reproduction (theoretical)
- Build AetherSDR on Linux without PipeWire: `cmake -DHAVE_PIPEWIRE=OFF ...`
- Connect to a radio
- Switch active TX slice to DIGU
- Attempt digital TX (manual MOX or via TCI) — observe radio is keyed but no audio is transmitted
Possible fixes
-
Gate `setDax()` on hosted-DAX availability — restore the platform guard around the `setDax(isDigital)` call, so Linux non-PipeWire keeps the radio's `dax` flag at 0:
```cpp
#if defined(Q_OS_MAC) || defined(HAVE_PIPEWIRE) || defined(Q_OS_WIN)
m_radioModel.transmitModel().setDax(isDigital);
#endif
```
-
Tie `setDax()` to actual stream creation — only set `dax=1` if `ensureDaxTxStream()` returned true.
-
Document and accept — note in the policy that Linux non-PipeWire is unsupported for digital TX and tell users to build with `HAVE_PIPEWIRE`.
Priority
Low — affects a niche user segment that probably wasn't doing digital TX through AetherSDR anyway. But worth tracking so we can choose between fix options when we have a reporter.
References
73, Jeremy KK7GWY & Claude (AI dev partner)
Background
Follow-up to #2271 (DAX2 coexistence policy). The new policy intentionally never creates a local `dax_tx` stream on Linux non-PipeWire builds (the `HostedDaxBridge` request requires `HAVE_PIPEWIRE` or `Q_OS_MAC`; `ExternalDaxRouteOnly` always returns `{false, route_only_does_not_require_local_stream}`).
However, `MainWindow.cpp:7491` now sends `transmit set dax=1` unconditionally for digital modes on all platforms, not just hosted-DAX ones. So on Linux non-PipeWire:
Pre-#2271, the `setDax(isDigital)` call was inside `#if defined(Q_OS_MAC) || defined(HAVE_PIPEWIRE)`, so Linux non-PipeWire users left the radio's `dax` flag in whatever state the radio had (typically 0). Net effect: digital TX used the radio's mic input. After #2271, digital TX uses DAX which is empty → silence.
Affected user segment
Linux users without PipeWire support (no `HAVE_PIPEWIRE` build flag) AND without alternate DAX routing. In practice this is a niche of a niche — these users typically can't do digital TX through AetherSDR at all today, so the regression may be theoretical. But the behaviour change is real.
Reproduction (theoretical)
Possible fixes
Gate `setDax()` on hosted-DAX availability — restore the platform guard around the `setDax(isDigital)` call, so Linux non-PipeWire keeps the radio's `dax` flag at 0:
```cpp
#if defined(Q_OS_MAC) || defined(HAVE_PIPEWIRE) || defined(Q_OS_WIN)
m_radioModel.transmitModel().setDax(isDigital);
#endif
```
Tie `setDax()` to actual stream creation — only set `dax=1` if `ensureDaxTxStream()` returned true.
Document and accept — note in the policy that Linux non-PipeWire is unsupported for digital TX and tell users to build with `HAVE_PIPEWIRE`.
Priority
Low — affects a niche user segment that probably wasn't doing digital TX through AetherSDR anyway. But worth tracking so we can choose between fix options when we have a reporter.
References
73, Jeremy KK7GWY & Claude (AI dev partner)