Skip to content

macOS/PipeWire: the slice-mode sync overwrites the transmit dax flag mid-transmission (follow-up to #6593) #6595

Open

Description

@NF0T

Report preparation

  • I used the AI-assisted bug report tool (Help → Support → File an Issue)
  • I have attached a support bundle or log file

What happened?

Follow-up to #6593 (fix for #6538 / #5524 / #6579), which gives the radio's transmit dax flag a single owner on Windows. On macOS and PipeWire builds, one writer of that flag still works outside that owner: the slice-mode sync in MainWindow::onSliceAdded()'s updateDaxTxMode (src/gui/MainWindow_Wiring.cpp:1952-1966 on main cedd50f4e).

That sync runs on every slice's modeChanged and txSliceChanged (MainWindow_Wiring.cpp:1981-1982). Each time, it recomputes "is the TX slice in a digital mode" and writes the result unconditionally:

m_audio->setDaxTxMode(isDigital);
...
m_radioModel.transmitModel().setDax(isDigital);

It doesn't know whether a producer currently needs the flag. So, inferred from the source and not yet reproduced:

  • A TCI transmission on a voice-mode TX slice can be cut off mid-over. A TCI voice keyer (OpsLog, the case in TCI DVK leaves DAX enabled after TX #5524) or any TCI client keying a USB/LSB slice sets dax=1 for its over. If any slice's mode changes during that over, the sync sends transmit set dax=0 and turns off AetherSDR's local DAX TX mode, so the rest of the over goes out with no modulation. A mode change on another slice, a band-stack restore, or a TCI modulation: command from another client would all do it.
  • The same applies to the voice keyer, AX.25, WSPR and RX Playback, which all hold the flag during their own transmissions.
  • The operator's DAX button doesn't survive a mode change. That is partly by design (DAX TX silent on Linux non-PipeWire after #2271 — radio gets dax=1 but no local stream #2273), but it means the flag on these platforms follows the last mode change, not what the operator chose.

Windows and non-PipeWire Linux builds don't compile this sync at all (#2670 / #2315), so they are unaffected.

What did you expect?

The mode sync should compose with the holders instead of overwriting them. The natural shape, after #6593:

  • Make "the TX slice is in a digital mode" one more RadioModel::DaxTxFlagHolder. Acquire it when the TX slice enters a digital mode, release it when it leaves.
  • The holder table then decides the wire value. A TCI over on a USB slice keeps dax=1 until its release. Leaving a digital mode hands back what the operator had before, instead of forcing 0.
  • AudioEngine::setDaxTxMode() needs the same treatment, or at least must not turn local DAX TX mode off while a producer is mid-over.

It needs care, because this is the path that works today on macOS and Linux:

Steps to reproduce

Not yet reproduced; this is from reading the source. Suggested repro on a PipeWire Linux or macOS build with a FlexRadio, into a dummy load or at low power:

  1. Slice A in USB, TX slice. Slice B on any mode.
  2. Start a TCI transmission on slice A (trx:0,true,tci with audio, e.g. a TCI voice keyer).
  3. While it's keyed, change slice B's mode.
  4. Expected bug: the wire log (aether.connection debug) shows transmit set dax=0 mid-over, and forward power drops for the rest of the over.

AetherSDR version

main cedd50f4e; still present with #6593 applied

Radio model & firmware

Any FlexRadio

Operating system

macOS, and Linux built with PipeWire

OS version and hardware

Any

73,
Ryan NF0T


👨🏼‍💻 Co-authored by Claude Opus 5.5

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingclaude-activeAetherClaude is actively working on this issue

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions