Il vecchio worker non drenava lo stderr di ffmpeg: dopo ~64KB il
pipe si bloccava e quando ffmpeg falliva subito (es. permesso
microfono negato su macOS) si vedeva solo 'ffmpeg exit -6' senza
contesto.
- Thread dedicato _drain_stderr() che legge stderr in continuo e
mantiene le ultime 50 righe in un buffer protetto
- _extract_friendly_error() riconosce i casi tipici e produce
messaggi italiani:
* exit -6 su macOS -> 'permesso Microfono mancante'
* Input/Output error -> 'dispositivo non disponibile'
* 'no such device' -> 'premere Aggiorna'
- Pre-flight check: aspetta che ffmpeg stampi 'Press [q]' (segnale
di device aperto) prima di emettere 'started'. Se ffmpeg muore
prima, l'errore viene segnalato senza falso 'recording in corso'
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Aggiunta sezione per registrare in MP3 320 kbps da qualsiasi
dispositivo di input audio del sistema (mixer, scheda audio
esterna, microfono interno, BlackHole / driver virtuali per audio
di sistema).
- core/recorder.py: list_input_devices() parsa l'output di
ffmpeg -list_devices su AVFoundation (macOS) e DirectShow (Win),
marca come 'virtual' i driver loopback noti (BlackHole, Soundflower,
Loopback, VB-Cable, Stereo Mix, OBS). start_recording() lancia
ffmpeg in thread e emette eventi tick/started/stopped/error.
- api/bridge.py: list_audio_inputs, start_audio_recording,
stop_audio_recording, is_audio_recording
- webui: hero rosso, dropdown dispositivi con badge 'loopback',
selettore bitrate, timer HH:MM:SS animato, bottone REC con
pulse animation, card 'Ultima registrazione' con durata+path
- Hint visibile: per registrare audio di sistema serve BlackHole
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>