# pabldi08/airsend architecture

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

- Interactive diagram: https://gitdiagram.com/pabldi08/airsend
- Repository: https://github.com/pabldi08/airsend

## Overview

AirSend sends Windows system or per-app audio to AirPlay 2 speakers. The principal flow is choosing or discovering a receiver, preparing a paired stream, capturing and encoding audio, then controlling playback. The graph also retains documented group playback, local mute/standby, and diagnostics capabilities. Some engine and UI paths are unsampled; their links are shown only where excerpts, the source index, or README support them.

Main entry points: [`crates/airsend-engine/src/lib.rs`](https://github.com/pabldi08/airsend/blob/main/crates/airsend-engine/src/lib.rs) (Engine commands), [`crates/airplay-core/src/streaming.rs`](https://github.com/pabldi08/airsend/blob/main/crates/airplay-core/src/streaming.rs) (Live streaming), [`crates/audio-capture/src/windows.rs`](https://github.com/pabldi08/airsend/blob/main/crates/audio-capture/src/windows.rs) (System capture), [`crates/airplay-core/src/discovery.rs`](https://github.com/pabldi08/airsend/blob/main/crates/airplay-core/src/discovery.rs) (Speaker discovery)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_interface["User interface"]
  node_winui["WinUI controls<br/>[MainWindow.xaml.cs]"]
  node_nativebridge["Native bridge<br/>[NativeEngine.cs]"]
  node_webui["Tauri UI<br/>[main.ts]"]
end

subgraph group_engine["Engine services"]
  node_engineapi["Engine commands<br/>[lib.rs]"]
end

subgraph group_airplay["AirPlay protocol"]
  node_discovery["Speaker discovery<br/>[discovery.rs]"]
  node_capabilities["Receiver capabilities<br/>[capabilities.rs]"]
  node_probe["Receiver probing<br/>[probe.rs]"]
  node_pairing["Pairing session<br/>[pairing.rs]"]
  node_groups["Speaker groups<br/>[groups.rs]"]
  node_stream["Live streaming<br/>[streaming.rs]"]
end

subgraph group_audio["Audio pipeline"]
  node_capture["System capture<br/>[windows.rs]"]
  node_appcapture["App capture"]
  node_endpoints["Audio endpoints<br/>[endpoints.rs]"]
  node_capturequeue["Capture queue<br/>[queue.rs]"]
  node_silence["Silence handling<br/>[silence.rs]"]
  node_encoder["Audio encoder<br/>[lib.rs]"]
end

subgraph group_support["Playback support"]
  node_metrics["Stream metrics<br/>[stream_metrics.rs]"]
  node_diagnostics["Diagnostics reports<br/>[diagnostics.rs]"]
  node_preferences["Preferences<br/>[preferences.rs]"]
  node_standby["Silence standby<br/>[standby.rs]"]
end

node_user(("Listener"))
node_speaker[("AirPlay speaker")]

node_user -->|"controls playback"| node_winui
node_winui -->|"invokes commands"| node_nativebridge
node_nativebridge -->|"calls engine"| node_engineapi
node_user -->|"selects speaker"| node_webui
node_webui -->|"invokes commands"| node_engineapi
node_engineapi -.->|"uses discovery"| node_discovery
node_discovery -->|"finds receivers"| node_speaker
node_discovery -->|"checks features"| node_capabilities
node_engineapi -.->|"probes receiver"| node_probe
node_engineapi -.->|"prepares session"| node_pairing
node_pairing -->|"opens RTSP session"| node_speaker
node_engineapi -.->|"selects group"| node_groups
node_engineapi -.->|"starts playback"| node_stream
node_stream -->|"sends audio"| node_speaker
node_engineapi -.->|"starts capture"| node_capture
node_engineapi -.->|"selects app audio"| node_appcapture
node_capture -->|"queues frames"| node_capturequeue
node_appcapture -->|"queues frames"| node_capturequeue
node_capture -->|"selects output"| node_endpoints
node_capture -->|"handles silence"| node_silence
node_capturequeue -.->|"feeds audio"| node_stream
node_stream -.->|"encodes audio"| node_encoder
node_stream -->|"records timing"| node_metrics
node_engineapi -.->|"records issues"| node_diagnostics
node_engineapi -->|"loads settings"| node_preferences
node_engineapi -.->|"manages standby"| node_standby
node_user -->|"listens on"| node_speaker

click node_winui "https://github.com/pabldi08/airsend/blob/main/native/MainWindow.xaml.cs"
click node_nativebridge "https://github.com/pabldi08/airsend/blob/main/native/NativeEngine.cs"
click node_webui "https://github.com/pabldi08/airsend/blob/main/ui/src/main.ts"
click node_engineapi "https://github.com/pabldi08/airsend/blob/main/crates/airsend-engine/src/lib.rs"
click node_discovery "https://github.com/pabldi08/airsend/blob/main/crates/airplay-core/src/discovery.rs"
click node_capabilities "https://github.com/pabldi08/airsend/blob/main/crates/airplay-core/src/capabilities.rs"
click node_probe "https://github.com/pabldi08/airsend/blob/main/crates/airplay-core/src/probe.rs"
click node_pairing "https://github.com/pabldi08/airsend/blob/main/crates/airplay-core/src/pairing.rs"
click node_groups "https://github.com/pabldi08/airsend/blob/main/crates/airplay-core/src/groups.rs"
click node_stream "https://github.com/pabldi08/airsend/blob/main/crates/airplay-core/src/streaming.rs"
click node_capture "https://github.com/pabldi08/airsend/blob/main/crates/audio-capture/src/windows.rs"
click node_appcapture "https://github.com/pabldi08/airsend/blob/main/crates/audio-capture/src/process_loopback.rs"
click node_endpoints "https://github.com/pabldi08/airsend/blob/main/crates/audio-capture/src/endpoints.rs"
click node_capturequeue "https://github.com/pabldi08/airsend/blob/main/crates/audio-capture/src/queue.rs"
click node_silence "https://github.com/pabldi08/airsend/blob/main/crates/audio-capture/src/silence.rs"
click node_encoder "https://github.com/pabldi08/airsend/blob/main/crates/audio-encode/src/lib.rs"
click node_metrics "https://github.com/pabldi08/airsend/blob/main/crates/airplay-core/src/stream_metrics.rs"
click node_diagnostics "https://github.com/pabldi08/airsend/blob/main/crates/airsend-engine/src/diagnostics.rs"
click node_preferences "https://github.com/pabldi08/airsend/blob/main/crates/airsend-engine/src/preferences.rs"
click node_standby "https://github.com/pabldi08/airsend/blob/main/crates/airsend-engine/src/standby.rs"

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_winui,node_nativebridge,node_webui toneBlue
class node_engineapi,node_speaker toneAmber
class node_discovery,node_capabilities,node_probe,node_pairing,node_groups,node_stream toneMint
class node_capture,node_appcapture,node_endpoints,node_capturequeue,node_silence,node_encoder toneRose
class node_metrics,node_diagnostics,node_preferences,node_standby,node_user toneIndigo
```

## Components

### User interface

- [WinUI controls](https://github.com/pabldi08/airsend/blob/main/native/MainWindow.xaml.cs): `native/MainWindow.xaml.cs`
- [Native bridge](https://github.com/pabldi08/airsend/blob/main/native/NativeEngine.cs): `native/NativeEngine.cs`
- [Tauri UI](https://github.com/pabldi08/airsend/blob/main/ui/src/main.ts): `ui/src/main.ts`

### Engine services

- [Engine commands](https://github.com/pabldi08/airsend/blob/main/crates/airsend-engine/src/lib.rs): `crates/airsend-engine/src/lib.rs`

### AirPlay protocol

- [Speaker discovery](https://github.com/pabldi08/airsend/blob/main/crates/airplay-core/src/discovery.rs): `crates/airplay-core/src/discovery.rs`
- [Receiver capabilities](https://github.com/pabldi08/airsend/blob/main/crates/airplay-core/src/capabilities.rs): `crates/airplay-core/src/capabilities.rs`
- [Receiver probing](https://github.com/pabldi08/airsend/blob/main/crates/airplay-core/src/probe.rs): `crates/airplay-core/src/probe.rs`
- [Pairing session](https://github.com/pabldi08/airsend/blob/main/crates/airplay-core/src/pairing.rs): `crates/airplay-core/src/pairing.rs`
- [Speaker groups](https://github.com/pabldi08/airsend/blob/main/crates/airplay-core/src/groups.rs): `crates/airplay-core/src/groups.rs`
- [Live streaming](https://github.com/pabldi08/airsend/blob/main/crates/airplay-core/src/streaming.rs): `crates/airplay-core/src/streaming.rs`

### Audio pipeline

- [System capture](https://github.com/pabldi08/airsend/blob/main/crates/audio-capture/src/windows.rs): `crates/audio-capture/src/windows.rs`
- [App capture](https://github.com/pabldi08/airsend/blob/main/crates/audio-capture/src/process_loopback.rs): `crates/audio-capture/src/process_loopback.rs`
- [Audio endpoints](https://github.com/pabldi08/airsend/blob/main/crates/audio-capture/src/endpoints.rs): `crates/audio-capture/src/endpoints.rs`
- [Capture queue](https://github.com/pabldi08/airsend/blob/main/crates/audio-capture/src/queue.rs): `crates/audio-capture/src/queue.rs`
- [Silence handling](https://github.com/pabldi08/airsend/blob/main/crates/audio-capture/src/silence.rs): `crates/audio-capture/src/silence.rs`
- [Audio encoder](https://github.com/pabldi08/airsend/blob/main/crates/audio-encode/src/lib.rs): `crates/audio-encode/src/lib.rs`

### Playback support

- [Stream metrics](https://github.com/pabldi08/airsend/blob/main/crates/airplay-core/src/stream_metrics.rs): `crates/airplay-core/src/stream_metrics.rs`
- [Diagnostics reports](https://github.com/pabldi08/airsend/blob/main/crates/airsend-engine/src/diagnostics.rs): `crates/airsend-engine/src/diagnostics.rs`
- [Preferences](https://github.com/pabldi08/airsend/blob/main/crates/airsend-engine/src/preferences.rs): `crates/airsend-engine/src/preferences.rs`
- [Silence standby](https://github.com/pabldi08/airsend/blob/main/crates/airsend-engine/src/standby.rs): `crates/airsend-engine/src/standby.rs`

### Other components

- **Listener**
- **AirPlay speaker**

## Connections

- Listener → WinUI controls: controls playback (evidence: `README.md`)
- WinUI controls → Native bridge: invokes commands (evidence: `native/MainWindow.xaml.cs`)
- Native bridge → Engine commands: calls engine (evidence: `native/NativeEngine.cs`)
- Listener → Tauri UI: selects speaker (evidence: `README.md`)
- Tauri UI → Engine commands: invokes commands (evidence: `ui/src/main.ts`)
- Engine commands → Speaker discovery: uses discovery
- Speaker discovery → AirPlay speaker: finds receivers (evidence: `crates/airplay-core/src/discovery.rs`)
- Speaker discovery → Receiver capabilities: checks features (evidence: `crates/airplay-core/src/discovery.rs`)
- Engine commands → Receiver probing: probes receiver
- Engine commands → Pairing session: prepares session
- Pairing session → AirPlay speaker: opens RTSP session (evidence: `crates/airplay-core/src/pairing.rs`)
- Engine commands → Speaker groups: selects group
- Engine commands → Live streaming: starts playback
- Live streaming → AirPlay speaker: sends audio (evidence: `README.md`)
- Engine commands → System capture: starts capture
- Engine commands → App capture: selects app audio
- System capture → Capture queue: queues frames (evidence: `crates/audio-capture/src/windows.rs`)
- App capture → Capture queue: queues frames (evidence: `crates/audio-capture/src/process_loopback.rs`)
- System capture → Audio endpoints: selects output (evidence: `crates/audio-capture/src/windows.rs`)
- System capture → Silence handling: handles silence (evidence: `crates/audio-capture/src/windows.rs`)
- Capture queue → Live streaming: feeds audio
- Live streaming → Audio encoder: encodes audio
- Live streaming → Stream metrics: records timing (evidence: `crates/airplay-core/src/streaming.rs`)
- Engine commands → Diagnostics reports: records issues (evidence: `crates/airsend-engine/src/lib.rs`)
- Engine commands → Preferences: loads settings (evidence: `crates/airsend-engine/src/lib.rs`)
- Engine commands → Silence standby: manages standby (evidence: `crates/airsend-engine/src/lib.rs`)
- Listener → AirPlay speaker: listens on (evidence: `README.md`)
