Expose the engine's live-input mode on the remote: an "Sorgente audio"
selector in the Audio tab lists the input devices the output reports and
switches between File/Playlist and a live USB capture (useInput); picking
File again stops the input. Grant the kiosk getUserMedia access with
--use-fake-ui-for-media-stream so device enumeration/labels work without a
prompt. Make reportDevices resilient (per-probe timeout, always report even
an empty list) so the UI gets feedback when no input is connected yet.
The Pi 5 has no audio input — a USB (line) sound card is required; visuals
react to the source while the audio stays on the mixer.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The Pi 5 vc4hdmi exposes only IEC958 and has no hardware mixing, so raw
ALSA is exclusive: once Chromium's Web Audio stream holds the HDMI device,
the media-element audio (the actual track) can't open it and stays silent
even though the analyser sees the signal. Install PipeWire + pipewire-pulse
as a software mixer (it also handles the IEC958 conversion) so every
Chromium stream mixes onto HDMI. Enable lingering so the user services
start at boot; set the HDMI sink to full volume.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Root cause of 'track does not start': the server re-broadcast incoming frames as
binary (Buffer), so the browser output page received Blobs, JSON.parse failed,
and every command (playTrack, etc.) was silently dropped — only the text-encoded
lastEffect sync got through. Broadcast as text now; net.js also handles Blob
defensively. Also: no-store for app assets + kiosk --disk-cache-size=1 so
redeploys always take effect; /api/clients debug endpoint; /api/peaks duration.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Drop --use-gl=egl (disabled the GPU on Chromium 149) and let Chromium pick the
default ANGLE/GLES backend with --ignore-gpu-blocklist -> hardware WebGL2.
- Launch kiosk via 'cage -- bash kiosk.sh' so a non-executable bit after rsync
no longer breaks startup.
- output.js reports gpuInfo (webgl2 + renderer) on load for remote diagnostics.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
New separate project (the Electron Mac app stays untouched). Reuses the visual
engine (WebGL shaders, effect catalog, Web Audio) verbatim and replaces Electron
IPC with a Node HTTP+WebSocket server:
- server.js: serves the kiosk output page + mobile control PWA, relays the same
ctl/rpt JSON protocol over WebSocket, plus REST for media library/upload,
JSON state (pads), waveform peaks and MP4 recording (ffmpeg).
- public/js/net.js: window.djv shim over WebSocket+HTTP so output.js runs intact.
- public/index.html + control.js: touch-first mobile remote (effects, media/queue,
ticker, pads, audio/EQ, fullscreen + recording).
- PWA (manifest + service worker + generated icons).
- scripts/: Chromium kiosk launcher + install-pi.sh (systemd units for Pi 5).
Verified: REST endpoints, WebSocket relay both directions, control PWA loads the
2958-effect catalog and renders. (Headless WebGL output not testable without GPU.)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>