7 Commits
Author SHA1 Message Date
lucianoandClaude Opus 4.8 6657d1afab Mobile: live external audio input (USB) source selector
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>
2026-06-30 12:27:41 +02:00
lucianoandClaude Opus 4.8 c8d12d789f Audio: route Pi output through PipeWire (HDMI software mixing)
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>
2026-06-30 10:28:40 +02:00
lucianoandClaude Opus 4.8 1a66a46b1f Fix: relay WebSocket messages as text frames (browsers got Blobs they could not parse)
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>
2026-06-29 14:58:33 +02:00
lucianoandClaude Opus 4.8 f3f4d0f81e Pi: WiFi hotspot (AP on wlan0, 10.42.0.1) + hotspot/wifi toggle scripts + README
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 14:17:26 +02:00
lucianoandClaude Opus 4.8 454a5caf77 Pi kiosk: add --test-type to hide Chromium unsupported-flag banner
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 14:05:15 +02:00
lucianoandClaude Opus 4.8 6fa53faf9c Pi: fix kiosk WebGL2 (hardware V3D via ANGLE) + robust kiosk launch
- 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>
2026-06-29 14:03:02 +02:00
lucianoandClaude Opus 4.8 b94c787231 DJ Visualizer Pi: standalone Node+WebSocket server with mobile PWA remote
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>
2026-06-29 13:06:15 +02:00