tawasuyu

tawasuyu/llimphi

Sovereign retained-mode GPU UI framework in Rust (wgpu+vello+taffy+parley), Elm loop, 40+ widgets.

Rust 238TOML 102Markdown 83Shell 24178 Definiciones

⎇ c5a232cf24788ab75a850ffe81eca5a7af50e2f8 widgets/waveform/LEEME.md Markdown · 44 líneas · 2.1 KB Historia crudo

chore: refresco desde el monorepo — 27 crates nuevos (anim, lottie, svg, mesh, image, layer, test, wire-view, widgets rag-sidebar/router/lazy-list/rive-button) y sync de los 95 existentes 93253cc22 · Sergio ·

1# llimphi-widget-waveform
2
3*Read this in English: [README.md](README.md).*
4
5Visor de **forma de onda en vivo**.
6
7Pattern análogo a [`llimphi-widget-timeline`](
8https://docs.rs/llimphi-widget-timeline): el widget **no mantiene
9estado** del audio (ni cpal, ni `AudioProbe`, ni ringbuffer). El caller
10le pasa un closure `Fn(&mut Vec<f32>) -> u16` que rellena un buffer con
11los últimos samples y devuelve cuántos **canales** intercalados trae;
12el widget hace el fold a mono y dibuja un **envelope min/max por
13columna** (polígono cerrado con relleno tenue + stroke por arriba y
14por abajo) sobre una **línea central** que siempre está presente como
15"ground" del visor. Sin handlers de mouse — paint-only.
16```text
17  ┌─────────────────────────────────────────────────┐
18  │   ▄▄▄    ▄  ▄▄▄  ▄▄    ▄▄  ▄                    │
19  │  ▄███▄  ▄█▄▄███▄▄██▄▄▄▄██▄▄█▄                   │
20  │──█████──███████████████████████─── centro ──────│
21  │  ▀███▀  ▀█▀▀███▀▀██▀▀▀▀██▀▀█▀                   │
22  │   ▀▀▀    ▀  ▀▀▀  ▀▀    ▀▀  ▀                    │
23  └─────────────────────────────────────────────────┘
24```
25Uso típico (reproductor con audio probe):
26```ignore
27use std::sync::Arc;
28let probe = audio_probe();        // Arc<AudioProbe> propia de la app
29let palette = WaveformPalette::default();
30waveform_view(
31    move |out| {
32        let (_sr, ch) = probe.snapshot(out);
33        ch                         // canales intercalados
34    },
35    &palette,
36)
37```
38Si el closure devuelve `0` canales (o no llena el buffer), el widget
39pinta sólo la línea central — útil para mostrar "visor vivo, sin
40señal" cuando el dispositivo de captura todavía no levantó.
41
42---
43
44Parte de **llimphi** — ver [llimphi](../../LEEME.md).

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.