# ralph-irving/squeezelite architecture

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

- Interactive diagram: https://gitdiagram.com/ralph-irving/squeezelite
- Repository: https://github.com/ralph-irving/squeezelite

## Overview

Squeezelite is a headless Squeezebox player: a Logitech Media Server (or compatible server) controls playback, supplies streams, and the player decodes and processes audio for a selected output. The graph preserves the distinct streaming, format decoding, audio processing, and device-output stages, plus control and optional integrations. The README is brief and the excerpts are partial, so uncertain module wiring is omitted; broader codec and output coverage is reflected from the repository tree.

Main entry points: [`decode.c`](https://github.com/ralph-irving/squeezelite/blob/master/decode.c) (Decode dispatcher), [`output.c`](https://github.com/ralph-irving/squeezelite/blob/master/output.c) (Output selection), [`main.c`](https://github.com/ralph-irving/squeezelite/blob/master/main.c) (Startup and options), [`slimproto.c`](https://github.com/ralph-irving/squeezelite/blob/master/slimproto.c) (SlimProto control)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_control["Player control"]
  node_main["Startup and options<br/>[main.c]"]
  node_slimproto["SlimProto control<br/>[slimproto.c]"]
  node_gpio["GPIO controls<br/>[gpio.c]"]
  node_ir["Infrared controls<br/>[ir.c]"]
end

subgraph group_streaming["Stream handling"]
  node_stream["Stream receiver<br/>[stream.c]"]
  node_buffer["Ring buffers<br/>[buffer.c]"]
end

subgraph group_decode["Format decoding"]
  node_decode["Decode dispatcher<br/>[decode.c]"]
  node_flac["FLAC decoder<br/>[flac.c]"]
  node_vorbis["Vorbis decoder<br/>[vorbis.c]"]
  node_mpg["MP3 decoders<br/>[mpg.c]"]
  node_mad["MAD decoder<br/>[mad.c]"]
  node_opus["Opus decoder<br/>[opus.c]"]
  node_ffmpeg["FFmpeg decoder<br/>[ffmpeg.c]"]
  node_faad["AAC decoder<br/>[faad.c]"]
  node_alac["ALAC decoder<br/>[alac.c]"]
  node_dsd["DSD decoder<br/>[dsd.c]"]
  node_dsd2pcm["DSD conversion<br/>[dsd2pcm.c]"]
end

subgraph group_audio["Audio processing"]
  node_pcm["PCM handling<br/>[pcm.c]"]
  node_process["Audio processing<br/>[process.c]"]
  node_resample["Resampling<br/>[resample.c]"]
end

subgraph group_outputs["Outputs and integrations"]
  node_output["Output selection<br/>[output.c]"]
  node_alsa["ALSA output<br/>[output_alsa.c]"]
  node_pulse["PulseAudio output<br/>[output_pulse.c]"]
  node_pa["PortAudio output<br/>[output_pa.c]"]
  node_stdout["Standard output<br/>[output_stdout.c]"]
  node_visualizer["Visualizer export<br/>[output_vis.c]"]
end

node_server(("Media server"))
node_device(("Audio device"))

node_main -->|"starts"| node_slimproto
node_main -->|"initializes"| node_stream
node_main -->|"configures"| node_output
node_server -->|"sends commands"| node_slimproto
node_slimproto -->|"sends status"| node_server
node_slimproto -->|"controls playback"| node_stream
node_stream -->|"writes stream data"| node_buffer
node_buffer -->|"provides stream data"| node_decode
node_decode -->|"dispatches"| node_flac
node_decode -->|"dispatches"| node_vorbis
node_decode -->|"dispatches"| node_mpg
node_decode -->|"dispatches"| node_mad
node_decode -->|"dispatches"| node_opus
node_decode -->|"dispatches"| node_ffmpeg
node_decode -->|"dispatches"| node_faad
node_decode -->|"dispatches"| node_alac
node_decode -->|"dispatches"| node_dsd
node_dsd -->|"converts DSD"| node_dsd2pcm
node_decode -->|"produces PCM"| node_pcm
node_pcm -->|"provides samples"| node_process
node_process -->|"resamples"| node_resample
node_process -->|"sends processed audio"| node_output
node_resample -->|"sends resampled audio"| node_output
node_output -->|"selects backend"| node_alsa
node_output -->|"selects backend"| node_pulse
node_output -->|"selects backend"| node_pa
node_output -->|"selects backend"| node_stdout
node_alsa -->|"plays audio"| node_device
node_pulse -->|"plays audio"| node_device
node_pa -->|"plays audio"| node_device
node_stdout -->|"writes audio data"| node_device
node_output -.->|"exports visualization"| node_visualizer
node_main -.->|"configures"| node_gpio
node_main -.->|"configures"| node_ir

click node_main "https://github.com/ralph-irving/squeezelite/blob/master/main.c"
click node_slimproto "https://github.com/ralph-irving/squeezelite/blob/master/slimproto.c"
click node_stream "https://github.com/ralph-irving/squeezelite/blob/master/stream.c"
click node_buffer "https://github.com/ralph-irving/squeezelite/blob/master/buffer.c"
click node_decode "https://github.com/ralph-irving/squeezelite/blob/master/decode.c"
click node_flac "https://github.com/ralph-irving/squeezelite/blob/master/flac.c"
click node_vorbis "https://github.com/ralph-irving/squeezelite/blob/master/vorbis.c"
click node_mpg "https://github.com/ralph-irving/squeezelite/blob/master/mpg.c"
click node_mad "https://github.com/ralph-irving/squeezelite/blob/master/mad.c"
click node_opus "https://github.com/ralph-irving/squeezelite/blob/master/opus.c"
click node_ffmpeg "https://github.com/ralph-irving/squeezelite/blob/master/ffmpeg.c"
click node_faad "https://github.com/ralph-irving/squeezelite/blob/master/faad.c"
click node_alac "https://github.com/ralph-irving/squeezelite/blob/master/alac.c"
click node_dsd "https://github.com/ralph-irving/squeezelite/blob/master/dsd.c"
click node_dsd2pcm "https://github.com/ralph-irving/squeezelite/blob/master/dsd2pcm/dsd2pcm.c"
click node_pcm "https://github.com/ralph-irving/squeezelite/blob/master/pcm.c"
click node_process "https://github.com/ralph-irving/squeezelite/blob/master/process.c"
click node_resample "https://github.com/ralph-irving/squeezelite/blob/master/resample.c"
click node_output "https://github.com/ralph-irving/squeezelite/blob/master/output.c"
click node_alsa "https://github.com/ralph-irving/squeezelite/blob/master/output_alsa.c"
click node_pulse "https://github.com/ralph-irving/squeezelite/blob/master/output_pulse.c"
click node_pa "https://github.com/ralph-irving/squeezelite/blob/master/output_pa.c"
click node_stdout "https://github.com/ralph-irving/squeezelite/blob/master/output_stdout.c"
click node_visualizer "https://github.com/ralph-irving/squeezelite/blob/master/output_vis.c"
click node_gpio "https://github.com/ralph-irving/squeezelite/blob/master/gpio.c"
click node_ir "https://github.com/ralph-irving/squeezelite/blob/master/ir.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_main,node_slimproto,node_gpio,node_ir toneBlue
class node_stream,node_buffer toneAmber
class node_decode,node_flac,node_vorbis,node_mpg,node_mad,node_opus,node_ffmpeg,node_faad,node_alac,node_dsd,node_dsd2pcm,node_server toneMint
class node_pcm,node_process,node_resample toneRose
class node_output,node_alsa,node_pulse,node_pa,node_stdout,node_visualizer,node_device toneIndigo
```

## Components

### Player control

- [Startup and options](https://github.com/ralph-irving/squeezelite/blob/master/main.c): `main.c`
- [SlimProto control](https://github.com/ralph-irving/squeezelite/blob/master/slimproto.c): `slimproto.c`
- [GPIO controls](https://github.com/ralph-irving/squeezelite/blob/master/gpio.c): `gpio.c`
- [Infrared controls](https://github.com/ralph-irving/squeezelite/blob/master/ir.c): `ir.c`

### Stream handling

- [Stream receiver](https://github.com/ralph-irving/squeezelite/blob/master/stream.c): `stream.c`
- [Ring buffers](https://github.com/ralph-irving/squeezelite/blob/master/buffer.c): `buffer.c`

### Format decoding

- [Decode dispatcher](https://github.com/ralph-irving/squeezelite/blob/master/decode.c): `decode.c`
- [FLAC decoder](https://github.com/ralph-irving/squeezelite/blob/master/flac.c): `flac.c`
- [Vorbis decoder](https://github.com/ralph-irving/squeezelite/blob/master/vorbis.c): `vorbis.c`
- [MP3 decoders](https://github.com/ralph-irving/squeezelite/blob/master/mpg.c): `mpg.c`
- [MAD decoder](https://github.com/ralph-irving/squeezelite/blob/master/mad.c): `mad.c`
- [Opus decoder](https://github.com/ralph-irving/squeezelite/blob/master/opus.c): `opus.c`
- [FFmpeg decoder](https://github.com/ralph-irving/squeezelite/blob/master/ffmpeg.c): `ffmpeg.c`
- [AAC decoder](https://github.com/ralph-irving/squeezelite/blob/master/faad.c): `faad.c`
- [ALAC decoder](https://github.com/ralph-irving/squeezelite/blob/master/alac.c): `alac.c`
- [DSD decoder](https://github.com/ralph-irving/squeezelite/blob/master/dsd.c): `dsd.c`
- [DSD conversion](https://github.com/ralph-irving/squeezelite/blob/master/dsd2pcm/dsd2pcm.c): `dsd2pcm/dsd2pcm.c`

### Audio processing

- [PCM handling](https://github.com/ralph-irving/squeezelite/blob/master/pcm.c): `pcm.c`
- [Audio processing](https://github.com/ralph-irving/squeezelite/blob/master/process.c): `process.c`
- [Resampling](https://github.com/ralph-irving/squeezelite/blob/master/resample.c): `resample.c`

### Outputs and integrations

- [Output selection](https://github.com/ralph-irving/squeezelite/blob/master/output.c): `output.c`
- [ALSA output](https://github.com/ralph-irving/squeezelite/blob/master/output_alsa.c): `output_alsa.c`
- [PulseAudio output](https://github.com/ralph-irving/squeezelite/blob/master/output_pulse.c): `output_pulse.c`
- [PortAudio output](https://github.com/ralph-irving/squeezelite/blob/master/output_pa.c): `output_pa.c`
- [Standard output](https://github.com/ralph-irving/squeezelite/blob/master/output_stdout.c): `output_stdout.c`
- [Visualizer export](https://github.com/ralph-irving/squeezelite/blob/master/output_vis.c): `output_vis.c`

### Other components

- **Media server**
- **Audio device**

## Connections

- Startup and options → SlimProto control: starts
- Startup and options → Stream receiver: initializes
- Startup and options → Output selection: configures
- Media server → SlimProto control: sends commands
- SlimProto control → Media server: sends status
- SlimProto control → Stream receiver: controls playback
- Stream receiver → Ring buffers: writes stream data
- Ring buffers → Decode dispatcher: provides stream data
- Decode dispatcher → FLAC decoder: dispatches
- Decode dispatcher → Vorbis decoder: dispatches
- Decode dispatcher → MP3 decoders: dispatches
- Decode dispatcher → MAD decoder: dispatches
- Decode dispatcher → Opus decoder: dispatches
- Decode dispatcher → FFmpeg decoder: dispatches
- Decode dispatcher → AAC decoder: dispatches
- Decode dispatcher → ALAC decoder: dispatches
- Decode dispatcher → DSD decoder: dispatches
- DSD decoder → DSD conversion: converts DSD
- Decode dispatcher → PCM handling: produces PCM
- PCM handling → Audio processing: provides samples
- Audio processing → Resampling: resamples
- Audio processing → Output selection: sends processed audio
- Resampling → Output selection: sends resampled audio
- Output selection → ALSA output: selects backend
- Output selection → PulseAudio output: selects backend
- Output selection → PortAudio output: selects backend
- Output selection → Standard output: selects backend
- ALSA output → Audio device: plays audio
- PulseAudio output → Audio device: plays audio
- PortAudio output → Audio device: plays audio
- Standard output → Audio device: writes audio data
- Output selection → Visualizer export: exports visualization
- Startup and options → GPIO controls: configures
- Startup and options → Infrared controls: configures
