- Rust 61%
- Slint 19.6%
- Shell 11.9%
- HTML 7.5%
|
|
||
|---|---|---|
| .cargo | ||
| .forgejo/workflows | ||
| .vscode | ||
| scripts | ||
| src | ||
| ui | ||
| .gitignore | ||
| app.rc | ||
| build.rs | ||
| Cargo.lock | ||
| Cargo.toml | ||
| CROSS_COMPILE.md | ||
| icon.ico | ||
| KIOSK-TUNING.md | ||
| KIOSK.md | ||
| README.md | ||
| ROTATION.md | ||
| WINDOWS.md | ||
SpectralMeter
Live-FFT-Spektrogramm (2D, Falschfarben) + LUFS- und dB(A)-Pegel in einer ressourcensparsamen Rust-GUI für ein 10"-Display. Zwei getrennte Audioeingänge (FFT und Loudness), Konfiguration im Browser. Zielplattform u.a. Raspberry Pi 1 (ARMv6).
Merkmale
- Spektrogramm als scrollender Falschfarben-Wasserfall (Colormaps: inferno, magma, heat, grayscale)
- Live-FFT-Streifen (Momentanspektrum) über dem Spektrogramm
- LUFS nach EBU R128 / ITU-R BS.1770: Momentary, Short-term, Integrated, True Peak
- dB(A)-Balken (A-Bewertung nach IEC 61672, Fast), mit Kalibrier-Offset
- Zwei getrennte Eingänge – verschiedene Geräte oder Kanäle eines Mehrkanal-Geräts
- Software-Rendering (Slint) – keine GPU/OpenGL nötig, läuft direkt aufs DRM-Display
- Browser-Konfiguration über einen sehr leichten HTTP-Server (kein Chromium auf dem Pi)
Architektur
ALSA-Gerät A ─┐ ┌─ FFT-Worker ── Spektrogramm + FFT-Streifen ─┐
├─ audio (cpal) ──mpsc─┤ ├─ Slint-GUI (Software-Renderer, 10")
ALSA-Gerät B ─┘ Dedup pro Gerät └─ Loudness-Worker ── LUFS + dB(A) ───────────┘
│
tiny_http Web-Config ── Browser
src/audio.rs– cpal/ALSA-Capture, fasst gleiche Geräte zu einem Stream zusammensrc/analysis/fft.rs– reelle FFT (realfft) + Hann-Fenster + dBsrc/analysis/loudness.rs– LUFS (Crateebur128, reines Rust)src/analysis/aweighting.rs– dB(A)-IIR (bilinear) + Fast-Zeitbewertungsrc/viz.rs+src/colormap.rs+src/pixbuf.rs– Falschfarben, Frequenz-Mapping, Scroll-Puffersrc/web.rs+ui/config.html– Browser-Konfiguration (REST/JSON)ui/appwindow.slint– die GUI
Entwicklung (x86-Host)
cargo run # Fenster (winit) mit Software-Renderer; ohne Audiogerät läuft ein Testsignal
Konfiguration danach im Browser: http://localhost:8080
Deploy auf den Raspberry Pi 1 (ARMv6)
Der Pi 1 ist zu schwach, um selbst zu bauen → Cross-Compile. Details in CROSS_COMPILE.md. Kurz:
./scripts/setup-cross.sh # Rust-Target + Linker (einmalig)
./scripts/sync-sysroot.sh raspberrypi.local pi # ARMv6-Sysroot von Pi OS holen
./scripts/build-pi.sh # baut mit --features pi
scp target/arm-unknown-linux-gnueabihf/release/spectralmeter pi@raspberrypi.local:~/
Auf dem Pi: KMS-Treiber in /boot/config.txt (dtoverlay=vc4-fkms-v3d), ohne Desktop
starten (siehe CROSS_COMPILE.md), dann ./spectralmeter.
Konfiguration
Wird als ~/spectralmeter.json gespeichert und über die Web-UI geändert. Änderungen an
Colormap/dB-Bereich/Frequenzen/Framerate/dB(A) wirken live; Gerätewechsel und
FFT-Größe brauchen einen Neustart (die Web-UI weist darauf hin).