v0.8.28
What's New
Audio Diagnostics Overhaul
The audio diagnostics page has been completely redesigned. Start Listening plays all incoming audio and collects real-time jitter, buffer health, and frame timing data. Click Report Problem to capture a full diagnostic report including raw PCM audio for each transmission. Reports are sent as multipart with separate PCM files and gzip-compressed JSON metadata.
Buffer Health Tracking
The audio worklet now tracks underruns, overflows, playout starts/stops, and min/max/avg buffer levels. The playout start threshold has been increased from 200ms to 400ms to better handle P25's ~185ms frame spacing. Underrun counting is limited to real buffer starvation events (first 30ms of silence), not the natural wind-down after transmissions end.
Jitter Chart Improvements
Outlier jitter measurements (>3x running mean) are filtered from charts while kept in the raw data for reports. Inter-transmission gaps no longer pollute jitter stats — the tracker properly resets between transmissions.
Analytics Fix
Fixed 500 errors on the analytics page when decode_rates or recorder_snapshots rows have NULL system_id or src_num values.
WebSocket Seq Counter Fix
The per-TG sequence counter on the WebSocket audio stream is now keyed on (systemId, tgid) instead of just tgid, preventing false gap detection when multiple systems share the same talkgroup ID.
Full Changelog
98856ebfeat(audio-diagnostics): capture PCM audio, filter jitter outliers, improve report flow2ac66cefix(tests): add AudioJitterStats to mock streamer interfaceb67efe1feat(debug-receiver): multipart reports with separate PCM audio files and gzip2fd0ca3feat(audio-diagnostics): add buffer health tracking and redesign report flowd5a8349feat(debug-receiver): increase body limit to 10MB, add gzip support, remove rate limitere81397cfix(audio): key WebSocket seq counter on system:tgid to prevent false gap detectioneea4063fix(stats): guard against NULL system_id and src_num in analytics queries