fix(audio): quiet TCC-denied retry spam + stop ffmpeg-missing panics#3612
Conversation
Two unrelated Sentry-noise fixes in the audio engine, both small.
SCREENPIPE-CLI-S8 (4 users / 198 events on current builds):
device_monitor.rs runs `start_device` every 2s. The error handler
already swallows "already running", "not found", and SCK "callback
never fired" transients, but NOT "declined TCCs" — so every tick on a
user who hasn't granted mic/screen permission hits `error!` and ships
to Sentry. Add the same warn-and-continue branch for TCC denials and
the older "Screen recording permission denied" wording.
SCREENPIPE-CLI-T0 + CLI-T5 (2 users, Linux):
ffmpeg.rs::encode_single_audio panicked via
`.expect("Failed to spawn FFmpeg process")` when ffmpeg wasn't in PATH
(Linux build doesn't bundle it). Same with find_ffmpeg_path().unwrap(),
output_path.to_str().unwrap(), stdin.take().expect(), and
wait_with_output().unwrap() — none should crash the audio worker.
Convert all five to `?` with anyhow context that points at the install
fix.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Diarization eval resultsSource:
DER, VAD FA, VAD FN, boundary err: lower is better. Continuity: higher is better, 1.0 = same hyp cluster across all silence gaps. Composed workday rows and Pipeline replay matrixSource: generated
The no-secret CI matrix runs local diarization under Parakeet/Whisper engine labels across live/background and mic/system device profiles. Real Deepgram/screenpipe-cloud smoke can be run locally with Transcription qualitySource: LibriSpeech test-clean (CC-BY-4.0) · per-model utterance cap · normalized lowercased word-level Levenshtein
WER + CER on read-aloud speech. Per-model utterance caps keep wall time bounded — tiny/parakeet at 50, the heavier large-v3-turbo-quantized at 20. See README for normalization rules. |
what
Two unrelated audio-engine Sentry fixes, both small.
SCREENPIPE-CLI-S8 — TCC-denied retry-loop spam
device_monitor.rs:1131-1148 runs `start_device` every 2s. The error handler already swallows "already running", "not found", and SCK "callback never fired" transients, but NOT "declined TCCs" — so every tick on a user who hasn't granted mic/screen permission hits `error!` and ships to Sentry.
SCREENPIPE-CLI-T0 + CLI-T5 — ffmpeg-missing panic (Linux)
ffmpeg.rs::encode_single_audio panicked via `.expect("Failed to spawn FFmpeg process")` when ffmpeg wasn't in PATH (Linux build doesn't bundle it). Same with `find_ffmpeg_path().unwrap()`, `output_path.to_str().unwrap()`, `stdin.take().expect()`, `wait_with_output().unwrap()` — five panic sites in 30 lines.
test plan
🤖 Generated with Claude Code