LEEME.md
llimphi-widget-waveform
Read this in English: README.md.
Visor de forma de onda en vivo.
Pattern análogo a llimphi-widget-timeline: el widget no mantiene
estado del audio (ni cpal, ni AudioProbe, ni ringbuffer). El caller
le pasa un closure Fn(&mut Vec<f32>) -> u16 que rellena un buffer con
los últimos samples y devuelve cuántos canales intercalados trae;
el widget hace el fold a mono y dibuja un envelope min/max por
columna (polígono cerrado con relleno tenue + stroke por arriba y
por abajo) sobre una línea central que siempre está presente como
"ground" del visor. Sin handlers de mouse — paint-only.
┌─────────────────────────────────────────────────┐
│ ▄▄▄ ▄ ▄▄▄ ▄▄ ▄▄ ▄ │
│ ▄███▄ ▄█▄▄███▄▄██▄▄▄▄██▄▄█▄ │
│──█████──███████████████████████─── centro ──────│
│ ▀███▀ ▀█▀▀███▀▀██▀▀▀▀██▀▀█▀ │
│ ▀▀▀ ▀ ▀▀▀ ▀▀ ▀▀ ▀ │
└─────────────────────────────────────────────────┘
Uso típico (reproductor con audio probe):
use std::sync::Arc;
let probe = audio_probe(); // Arc<AudioProbe> propia de la app
let palette = WaveformPalette::default();
waveform_view(
move |out| {
let (_sr, ch) = probe.snapshot(out);
ch // canales intercalados
},
&palette,
)
Si el closure devuelve 0 canales (o no llena el buffer), el widget
pinta sólo la línea central — útil para mostrar "visor vivo, sin
señal" cuando el dispositivo de captura todavía no levantó.
Parte de llimphi — ver llimphi.