Skip to content

DAX TX silent on Linux non-PipeWire after #2271 — radio gets dax=1 but no local stream #2273

Description

@ten9876

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)

  1. Build AetherSDR on Linux without PipeWire: `cmake -DHAVE_PIPEWIRE=OFF ...`
  2. Connect to a radio
  3. Switch active TX slice to DIGU
  4. Attempt digital TX (manual MOX or via TCI) — observe radio is keyed but no audio is transmitted

Possible fixes

  1. 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
    ```

  2. Tie `setDax()` to actual stream creation — only set `dax=1` if `ensureDaxTxStream()` returned true.

  3. 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)

Metadata

Metadata

Assignees

No one assigned

    Labels

    audioAudio engine and streamingbugSomething isn't workingmaintainer-reviewRequires maintainer review before any action is takenpriority: lowLow priorityprotocolSmartSDR protocol

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions