# charl024/term_auviz architecture

> Architecture diagram of the GitHub repository charl024/term_auviz, 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/charl024/term_auviz
- Repository: https://github.com/charl024/term_auviz

## Overview

term_auviz is a terminal audio visualizer. The user launches the app; its frame loop polls input, retrieves captured audio, processes complete FFT-sized blocks into frequency magnitudes, then draws and renders the visualization. Capture discovers an audio node through PipeWire, receives stream buffers, mixes channels to mono, and queues samples in a ring buffer. The graph also shows frame pacing and the input and graphics modules; their implementation was not sampled, so their internal behavior is not expanded.

Main entry points: [`src/app.c`](https://github.com/charl024/term_auviz/blob/main/src/app.c) (Frame Loop), [`src/pipewire_backend.c`](https://github.com/charl024/term_auviz/blob/main/src/pipewire_backend.c) (Stream Capture), [`include/state.h`](https://github.com/charl024/term_auviz/blob/main/include/state.h) (App State), [`src/graphics.c`](https://github.com/charl024/term_auviz/blob/main/src/graphics.c) (Visualization)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_app["Application"]
  node_main["Program Entry<br/>[main.c]"]
  node_app_run["Frame Loop<br/>[app.c]"]
  node_timing["Frame Timing<br/>[time_helper.h]"]
  node_input["Input Handling<br/>[input.c]"]
  node_state["App State<br/>[state.h]"]
end

subgraph group_capture["Audio Capture"]
  node_capture["Stream Capture<br/>[pipewire_backend.c]"]
  node_ringbuffer[("Audio Ring Buffer<br/>[ringbuffer.c]")]
end

subgraph group_processing["Signal Processing"]
  node_audio["FFT Processing<br/>[audio_processing.c]"]
end

subgraph group_display["Terminal Display"]
  node_graphics["Visualization<br/>[graphics.c]"]
end

node_user(("User"))
node_pipewire_service["PipeWire"]
node_notcurses["Notcurses"]
node_terminal["Terminal"]

node_user -->|"launches"| node_main
node_main -->|"calls"| node_app_run
node_app_run -->|"checks frame time"| node_timing
node_app_run -->|"polls input"| node_input
node_input -->|"updates"| node_state
node_app_run -->|"starts and reads"| node_capture
node_pipewire_service -->|"provides audio"| node_capture
node_capture -->|"writes samples"| node_ringbuffer
node_capture -->|"discovers and connects"| node_pipewire_service
node_ringbuffer -->|"returns samples"| node_capture
node_app_run -->|"processes audio"| node_audio
node_audio -->|"writes spectrum"| node_state
node_app_run -->|"draws frame"| node_graphics
node_state -->|"provides spectrum and layout"| node_graphics
node_app_run -->|"renders frame"| node_notcurses
node_graphics -->|"draws with"| node_notcurses
node_notcurses -->|"displays"| node_terminal

click node_main "https://github.com/charl024/term_auviz/blob/main/src/main.c"
click node_app_run "https://github.com/charl024/term_auviz/blob/main/src/app.c"
click node_timing "https://github.com/charl024/term_auviz/blob/main/include/time_helper.h"
click node_input "https://github.com/charl024/term_auviz/blob/main/src/input.c"
click node_capture "https://github.com/charl024/term_auviz/blob/main/src/pipewire_backend.c"
click node_ringbuffer "https://github.com/charl024/term_auviz/blob/main/src/ringbuffer.c"
click node_audio "https://github.com/charl024/term_auviz/blob/main/src/audio_processing.c"
click node_state "https://github.com/charl024/term_auviz/blob/main/include/state.h"
click node_graphics "https://github.com/charl024/term_auviz/blob/main/src/graphics.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_app_run,node_timing,node_input,node_state,node_user toneBlue
class node_capture,node_ringbuffer toneAmber
class node_audio toneMint
class node_graphics toneRose
class node_pipewire_service,node_notcurses,node_terminal toneIndigo
```

## Components

### Application

- [Program Entry](https://github.com/charl024/term_auviz/blob/main/src/main.c): `src/main.c`
- [Frame Loop](https://github.com/charl024/term_auviz/blob/main/src/app.c): `src/app.c`
- [Frame Timing](https://github.com/charl024/term_auviz/blob/main/include/time_helper.h): `include/time_helper.h`
- [Input Handling](https://github.com/charl024/term_auviz/blob/main/src/input.c): `src/input.c`
- [App State](https://github.com/charl024/term_auviz/blob/main/include/state.h): `include/state.h`

### Audio Capture

- [Stream Capture](https://github.com/charl024/term_auviz/blob/main/src/pipewire_backend.c): `src/pipewire_backend.c`
- [Audio Ring Buffer](https://github.com/charl024/term_auviz/blob/main/src/ringbuffer.c): `src/ringbuffer.c`

### Signal Processing

- [FFT Processing](https://github.com/charl024/term_auviz/blob/main/src/audio_processing.c): `src/audio_processing.c`

### Terminal Display

- [Visualization](https://github.com/charl024/term_auviz/blob/main/src/graphics.c): `src/graphics.c`

### Other components

- **User**
- **PipeWire**
- **Notcurses**
- **Terminal**

## Connections

- User → Program Entry: launches
- Program Entry → Frame Loop: calls
- Frame Loop → Frame Timing: checks frame time
- Frame Loop → Input Handling: polls input
- Input Handling → App State: updates
- Frame Loop → Stream Capture: starts and reads
- PipeWire → Stream Capture: provides audio
- Stream Capture → Audio Ring Buffer: writes samples
- Stream Capture → PipeWire: discovers and connects
- Audio Ring Buffer → Stream Capture: returns samples
- Frame Loop → FFT Processing: processes audio
- FFT Processing → App State: writes spectrum
- Frame Loop → Visualization: draws frame
- App State → Visualization: provides spectrum and layout
- Frame Loop → Notcurses: renders frame
- Visualization → Notcurses: draws with
- Notcurses → Terminal: displays
