# arancormonk/dsd-neo architecture

> Architecture diagram of the GitHub repository arancormonk/dsd-neo, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-11). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/arancormonk/dsd-neo
- Repository: https://github.com/arancormonk/dsd-neo

## Overview

DSD-neo is a cross-platform digital-radio decoder. A user supplies live SDR/audio input or a recording; the runtime demodulates and decodes radio protocols, optionally follows trunked calls or scans systems, then plays voice and presents caller, system, and site information. The graph also preserves documented recording, import, and remote-control capabilities. The README establishes the product workflow; sampled code confirms engine/DSP and platform entry-point responsibilities, but several subsystem links remain unverified because their implementations were not sampled.

Main entry points: [`src/engine/engine.c`](https://github.com/arancormonk/dsd-neo/blob/main/src/engine/engine.c) (Decode engine), [`src/protocol`](https://github.com/arancormonk/dsd-neo/tree/main/src/protocol) (Protocol decoders), [`apps/dsd-cli/main.c`](https://github.com/arancormonk/dsd-neo/blob/main/apps/dsd-cli/main.c) (CLI frontend), [`android/package/src/io/github/arancormonk/dsdneo/DecoderService.kt`](https://github.com/arancormonk/dsd-neo/blob/main/android/package/src/io/github/arancormonk/dsdneo/DecoderService.kt) (Android app)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_entry["Applications and control"]
  node_cli["CLI frontend<br/>[main.c]"]
  node_android["Android app<br/>[DecoderService.kt]"]
  node_qt["Qt controller<br/>[ui_controller.cpp]"]
  node_engine["Decode engine<br/>[engine.c]"]
  node_display["Status and display"]
end

subgraph group_radio["Radio reception"]
  node_sources["Radio and audio inputs"]
  node_dsp["Demodulation<br/>[demod_pipeline.cpp]"]
  node_iq["I/Q capture and replay<br/>[iq_replay.c]"]
end

subgraph group_decode["Decoding and calls"]
  node_protocols["Protocol decoders"]
  node_fec["Error correction<br/>[fec.c]"]
  node_trunk["Trunking and scan<br/>[engine.c]"]
  node_identity["Caller and site identity"]
  node_keys["Decryption keys<br/>[keyring.c]"]
end

subgraph group_output["Voice and records"]
  node_audio["Voice playback"]
  node_recording["Call recording<br/>[wav_recording.c]"]
  node_history["Event history<br/>[dsd_events.c]"]
end

subgraph group_integrations["Imports and services"]
  node_rr["RadioReference import<br/>[rr_client.c]"]
  node_rdio["rdio-scanner upload"]
end

node_user(("Radio listener"))

node_user -->|"runs"| node_cli
node_user -->|"uses"| node_android
node_cli -->|"starts"| node_engine
node_android -->|"controls"| node_engine
node_qt -.->|"controls"| node_engine
node_engine -->|"opens input"| node_sources
node_sources -.->|"supplies samples"| node_dsp
node_dsp -.->|"provides demodulated signal"| node_protocols
node_protocols -.->|"uses correction"| node_fec
node_engine -->|"runs tuning and scan"| node_trunk
node_protocols -.->|"yields radio identity"| node_identity
node_engine -->|"plays decoded voice"| node_audio
node_engine -->|"records calls"| node_recording
node_engine -->|"keeps event history"| node_history
node_engine -.->|"publishes decode status"| node_display
node_user -->|"imports systems"| node_rr
node_engine -->|"uploads calls"| node_rdio
node_user -->|"captures or replays"| node_iq
node_user -->|"provides keys"| node_keys

click node_cli "https://github.com/arancormonk/dsd-neo/blob/main/apps/dsd-cli/main.c"
click node_android "https://github.com/arancormonk/dsd-neo/blob/main/android/package/src/io/github/arancormonk/dsdneo/DecoderService.kt"
click node_qt "https://github.com/arancormonk/dsd-neo/blob/main/src/ui/qt/ui_controller.cpp"
click node_engine "https://github.com/arancormonk/dsd-neo/blob/main/src/engine/engine.c"
click node_sources "https://github.com/arancormonk/dsd-neo/tree/main/src/io"
click node_dsp "https://github.com/arancormonk/dsd-neo/blob/main/src/dsp/demod_pipeline.cpp"
click node_protocols "https://github.com/arancormonk/dsd-neo/tree/main/src/protocol"
click node_fec "https://github.com/arancormonk/dsd-neo/blob/main/src/fec/fec.c"
click node_trunk "https://github.com/arancormonk/dsd-neo/blob/main/src/engine/engine.c"
click node_identity "https://github.com/arancormonk/dsd-neo/blob/main/src/core/util/received_identity.c"
click node_audio "https://github.com/arancormonk/dsd-neo/tree/main/src/core/audio"
click node_recording "https://github.com/arancormonk/dsd-neo/blob/main/src/core/file/wav_recording.c"
click node_history "https://github.com/arancormonk/dsd-neo/blob/main/src/core/util/dsd_events.c"
click node_display "https://github.com/arancormonk/dsd-neo/tree/main/src/ui"
click node_rr "https://github.com/arancormonk/dsd-neo/blob/main/src/runtime/radioreference/rr_client.c"
click node_rdio "https://github.com/arancormonk/dsd-neo/tree/main/src/runtime"
click node_iq "https://github.com/arancormonk/dsd-neo/blob/main/src/io/iq/iq_replay.c"
click node_keys "https://github.com/arancormonk/dsd-neo/blob/main/src/core/vocoder/keyring.c"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_cli,node_android,node_qt,node_engine,node_display toneBlue
class node_sources,node_dsp,node_iq toneAmber
class node_protocols,node_fec,node_trunk,node_identity,node_keys toneMint
class node_audio,node_recording,node_history toneRose
class node_rr,node_rdio,node_user toneIndigo
```

## Components

### Applications and control

- [CLI frontend](https://github.com/arancormonk/dsd-neo/blob/main/apps/dsd-cli/main.c): `apps/dsd-cli/main.c`
- [Android app](https://github.com/arancormonk/dsd-neo/blob/main/android/package/src/io/github/arancormonk/dsdneo/DecoderService.kt): `android/package/src/io/github/arancormonk/dsdneo/DecoderService.kt`
- [Qt controller](https://github.com/arancormonk/dsd-neo/blob/main/src/ui/qt/ui_controller.cpp): `src/ui/qt/ui_controller.cpp`
- [Decode engine](https://github.com/arancormonk/dsd-neo/blob/main/src/engine/engine.c): `src/engine/engine.c`
- [Status and display](https://github.com/arancormonk/dsd-neo/tree/main/src/ui): `src/ui`

### Radio reception

- [Radio and audio inputs](https://github.com/arancormonk/dsd-neo/tree/main/src/io): `src/io`
- [Demodulation](https://github.com/arancormonk/dsd-neo/blob/main/src/dsp/demod_pipeline.cpp): `src/dsp/demod_pipeline.cpp`
- [I/Q capture and replay](https://github.com/arancormonk/dsd-neo/blob/main/src/io/iq/iq_replay.c): `src/io/iq/iq_replay.c`

### Decoding and calls

- [Protocol decoders](https://github.com/arancormonk/dsd-neo/tree/main/src/protocol): `src/protocol`
- [Error correction](https://github.com/arancormonk/dsd-neo/blob/main/src/fec/fec.c): `src/fec/fec.c`
- [Trunking and scan](https://github.com/arancormonk/dsd-neo/blob/main/src/engine/engine.c): `src/engine/engine.c`
- [Caller and site identity](https://github.com/arancormonk/dsd-neo/blob/main/src/core/util/received_identity.c): `src/core/util/received_identity.c`
- [Decryption keys](https://github.com/arancormonk/dsd-neo/blob/main/src/core/vocoder/keyring.c): `src/core/vocoder/keyring.c`

### Voice and records

- [Voice playback](https://github.com/arancormonk/dsd-neo/tree/main/src/core/audio): `src/core/audio`
- [Call recording](https://github.com/arancormonk/dsd-neo/blob/main/src/core/file/wav_recording.c): `src/core/file/wav_recording.c`
- [Event history](https://github.com/arancormonk/dsd-neo/blob/main/src/core/util/dsd_events.c): `src/core/util/dsd_events.c`

### Imports and services

- [RadioReference import](https://github.com/arancormonk/dsd-neo/blob/main/src/runtime/radioreference/rr_client.c): `src/runtime/radioreference/rr_client.c`
- [rdio-scanner upload](https://github.com/arancormonk/dsd-neo/tree/main/src/runtime): `src/runtime`

### Other components

- **Radio listener**

## Connections

- Radio listener → CLI frontend: runs (evidence: `README.md`)
- Radio listener → Android app: uses (evidence: `README.md`)
- CLI frontend → Decode engine: starts (evidence: `apps/dsd-cli/main.c`)
- Android app → Decode engine: controls (evidence: `android/package/src/io/github/arancormonk/dsdneo/DecoderService.kt`)
- Qt controller → Decode engine: controls
- Decode engine → Radio and audio inputs: opens input (evidence: `src/engine/engine.c`)
- Radio and audio inputs → Demodulation: supplies samples
- Demodulation → Protocol decoders: provides demodulated signal
- Protocol decoders → Error correction: uses correction
- Decode engine → Trunking and scan: runs tuning and scan (evidence: `README.md`)
- Protocol decoders → Caller and site identity: yields radio identity
- Decode engine → Voice playback: plays decoded voice (evidence: `README.md`)
- Decode engine → Call recording: records calls (evidence: `README.md`)
- Decode engine → Event history: keeps event history (evidence: `README.md`)
- Decode engine → Status and display: publishes decode status
- Radio listener → RadioReference import: imports systems (evidence: `README.md`)
- Decode engine → rdio-scanner upload: uploads calls (evidence: `README.md`)
- Radio listener → I/Q capture and replay: captures or replays (evidence: `README.md`)
- Radio listener → Decryption keys: provides keys (evidence: `README.md`)
