Skip to content

Native SmartSDR DAX reports "No data arriving from radio" when AetherSDR is running alongside it #2223

@dsiminiuk

Description

@dsiminiuk

Report preparation

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

Native SmartSDR DAX reports "No data arriving from radio" when AetherSDR is running alongside it

What happened?

When AetherSDR, native SmartSDR DAX, and VarAC are all running simultaneously, SmartSDR DAX connects briefly and then immediately displays:

"Streaming at 0 kbps"
"No data arriving from radio -- check firewall"

The firewall is fully disabled. The radio and PC are on the same LAN, connected to the same switch. This is not AetherSDR's internal DAX implementation — it is the native SmartSDR DAX client (part of the SmartSDR for Windows installation) running as a separate process alongside AetherSDR.

What did you expect?

Native SmartSDR DAX should receive its VITA-49 audio data stream from the FLEX-8600 without interference from AetherSDR. Both clients should be able to co-exist in a Multi-Flex configuration: AetherSDR controlling its own slice/panadapter, and SmartSDR DAX delivering audio to VarAC independently.

Steps to reproduce

  1. Launch AetherSDR 0.9.3 on Windows 11
  2. Connect to FLEX-8600 (firmware 4.2.18.41174)
  3. Launch native SmartSDR DAX (from SmartSDR for Windows install)
  4. Launch VarAC (configured to use SmartSDR DAX as its audio device)
  5. Observe that SmartSDR DAX shows "Streaming at 0 kbps" and "No data arriving from radio -- check firewall"

Note: Firewall is off. Radio and PC are on the same LAN/switch. The issue does not reproduce when AetherSDR is not running (SmartSDR DAX works correctly on its own).

Radio model & firmware

  • Radio: FLEX-8600
  • Firmware: 4.2.18.41174

OS & version

  • OS: Windows 11
  • AetherSDR version: 0.9.3
  • Qt version: 6.7.3

Developer Notes

Background — VITA-49 UDP port registration and the likely conflict

The FlexRadio protocol requires each client to register its UDP port with the radio so the radio knows where to send VITA-49 streams. From CLAUDE.md, AetherSDR's connection sequence is:

  1. Bind a UDP socket
  2. Send a \x00 keepalive byte to radio:4992 (port registration)
  3. Issue client udpport <port>

When two clients are present (AetherSDR + SmartSDR DAX), both register UDP ports via this mechanism. The most likely failure mode on Windows is one of the following:


Hypothesis 1 — UDP port collision / socket binding conflict (most likely)

On Windows, QUdpSocket may bind to 0.0.0.0:<port> without SO_REUSEADDR / SO_REUSEPORT. If AetherSDR binds the DAX port range that SmartSDR DAX also tries to bind, DAX's socket bind will fail silently and it will receive no data.

Relevant code to inspect:

  • src/core/PanadapterStream.cpp — UDP socket creation and binding
    • Check whether QUdpSocket::bind() is called with QUdpSocket::ShareAddress | QUdpSocket::ReuseAddressHint flags
    • On Windows, omitting these flags causes exclusive port ownership
  • src/core/AudioEngine.cpp — any additional UDP socket binds for RX/TX audio streams
  • src/core/RadioConnection.cpp — the client udpport registration command and UDP keepalive \x00 packet

Fix to try: Add QUdpSocket::ShareAddress | QUdpSocket::ReuseAddressHint to all QUdpSocket::bind() calls in PanadapterStream and AudioEngine.


Hypothesis 2 — AetherSDR's stream create command claims the DAX stream ID

From CLAUDE.md:

stream create type=remote_audio_rx compression=none → radio starts sending VITA-49 audio to our UDP port

If AetherSDR requests an audio stream on the same DAX channel that SmartSDR DAX is attempting to use, the radio may direct the audio to AetherSDR's registered UDP endpoint rather than DAX's. SmartSDR DAX would then receive nothing.

Relevant code to inspect:

  • src/core/RadioConnection.cpp — where stream create type=remote_audio_rx is issued; verify the slice/channel association
  • src/models/RadioModel.cpp — the createDefaultSlice() path; confirm it does not inadvertently claim a DAX channel index

Hypothesis 3 — Multi-Flex client_handle filtering not applied on Windows

CLAUDE.md documents three-layer Multi-Flex filtering keyed by client_handle. If this filtering is not fully implemented or has a Windows-specific regression in v0.9.3, AetherSDR may process and "consume" VITA-49 packets intended for SmartSDR DAX, causing DAX to starve.

Relevant code to inspect:

  • src/models/RadioModel.cpphandleSliceStatus(), m_ownedSliceIds logic
  • src/core/PanadapterStream.cppsetOwnedStreamIds(), stream ID filtering for PCC 0x0123 (DAX audio int16)

Hypothesis 4 — DAX on Windows is not yet implemented

CLAUDE.md explicitly lists under What's NOT Yet Implemented:

DAX on Windows (virtual audio devices, #87)

It is possible that AetherSDR's Windows build still contains DAX-related stream create commands that request audio streams from the radio without a functional Windows audio sink — effectively claiming the stream and dropping the data, while starving native SmartSDR DAX.

Relevant code to inspect:

  • src/core/PipeWireAudioBridge.cpp — Linux-only; verify it is #ifdef-guarded and not compiled on Windows
  • src/core/AudioEngine.cpp — check #ifdef Q_OS_WIN guards around any DAX stream creation calls
  • src/core/RadioConnection.cppstream create issuance; confirm it is suppressed on Windows if DAX is unsupported

Logging to capture diagnostic data

Enable the following categories in Help → Support before reproducing:

Category What it captures
RadioConnection client udpport registration, stream create commands, all TCP command/response traffic
PanadapterStream UDP socket bind details, VITA-49 packet routing, stream ID filtering
AudioEngine RX/TX audio stream setup, any DAX-related stream requests
RadioModel Slice ownership, client_handle filtering, Multi-Flex slot decisions

After enabling logging, reproduce the issue (AetherSDR connect → DAX launch → VarAC), then use Send to Support to collect the bundle.

A Wireshark capture on the LAN interface filtered to udp && ip.addr == <radio_IP> would also be highly informative — particularly to confirm whether VITA-49 DAX packets (PCC 0x0123) are being sent to AetherSDR's port instead of SmartSDR DAX's port.


Summary of files most likely involved

File Relevance
src/core/PanadapterStream.cpp UDP socket binding (Windows SO_REUSEADDR flags)
src/core/RadioConnection.cpp client udpport, stream create, UDP \x00 registration
src/core/AudioEngine.cpp Windows DAX guard (#ifdef Q_OS_WIN)
src/models/RadioModel.cpp Multi-Flex client_handle filtering, stream ownership
src/core/PipeWireAudioBridge.cpp Verify Linux-only compile guard

Metadata

Metadata

Assignees

No one assigned

    Labels

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

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions