Report preparation
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
- Launch AetherSDR 0.9.3 on Windows 11
- Connect to FLEX-8600 (firmware 4.2.18.41174)
- Launch native SmartSDR DAX (from SmartSDR for Windows install)
- Launch VarAC (configured to use SmartSDR DAX as its audio device)
- 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:
- Bind a UDP socket
- Send a
\x00 keepalive byte to radio:4992 (port registration)
- 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.cpp — handleSliceStatus(), m_ownedSliceIds logic
src/core/PanadapterStream.cpp — setOwnedStreamIds(), 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.cpp — stream 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 |
Report preparation
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:
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
Radio model & firmware
OS & version
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:\x00keepalive byte toradio:4992(port registration)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,
QUdpSocketmay bind to0.0.0.0:<port>withoutSO_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 bindingQUdpSocket::bind()is called withQUdpSocket::ShareAddress | QUdpSocket::ReuseAddressHintflagssrc/core/AudioEngine.cpp— any additional UDP socket binds for RX/TX audio streamssrc/core/RadioConnection.cpp— theclient udpportregistration command and UDP keepalive\x00packetFix to try: Add
QUdpSocket::ShareAddress | QUdpSocket::ReuseAddressHintto allQUdpSocket::bind()calls inPanadapterStreamandAudioEngine.Hypothesis 2 — AetherSDR's
stream createcommand claims the DAX stream IDFrom
CLAUDE.md: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— wherestream create type=remote_audio_rxis issued; verify the slice/channel associationsrc/models/RadioModel.cpp— thecreateDefaultSlice()path; confirm it does not inadvertently claim a DAX channel indexHypothesis 3 — Multi-Flex
client_handlefiltering not applied on WindowsCLAUDE.mddocuments three-layer Multi-Flex filtering keyed byclient_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.cpp—handleSliceStatus(),m_ownedSliceIdslogicsrc/core/PanadapterStream.cpp—setOwnedStreamIds(), stream ID filtering for PCC0x0123(DAX audio int16)Hypothesis 4 — DAX on Windows is not yet implemented
CLAUDE.mdexplicitly lists under What's NOT Yet Implemented:It is possible that AetherSDR's Windows build still contains DAX-related
stream createcommands 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 Windowssrc/core/AudioEngine.cpp— check#ifdef Q_OS_WINguards around any DAX stream creation callssrc/core/RadioConnection.cpp—stream createissuance; confirm it is suppressed on Windows if DAX is unsupportedLogging to capture diagnostic data
Enable the following categories in Help → Support before reproducing:
RadioConnectionclient udpportregistration,stream createcommands, all TCP command/response trafficPanadapterStreamAudioEngineRadioModelclient_handlefiltering, Multi-Flex slot decisionsAfter 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 (PCC0x0123) are being sent to AetherSDR's port instead of SmartSDR DAX's port.Summary of files most likely involved
src/core/PanadapterStream.cppSO_REUSEADDRflags)src/core/RadioConnection.cppclient udpport,stream create, UDP\x00registrationsrc/core/AudioEngine.cpp#ifdef Q_OS_WIN)src/models/RadioModel.cppclient_handlefiltering, stream ownershipsrc/core/PipeWireAudioBridge.cpp