2026-04-02 — Сага о простое колонки и SinkMonitor
Issue #120 — «Recurring speaker disconnection» — пришёл 1 апреля от пользователя Docker Compose на PipeWire. Что выглядело как простой баг таймера, обернулось четырёхдневной перестройкой архитектуры системы определения простоя.
Пользователь @mdorchain сообщил, что Samsung Soundbar отключается каждые ~15 минут, даже когда музыка активно играет. В логах видно: таймер простоя сработал ровно через 15 минут — полностью игнорируя аудиопоток.
Расследование
Заголовок раздела «Расследование»Причина 1: таймер проверял только audio_streaming (v2.52.2–2.52.3)
Заголовок раздела «Причина 1: таймер проверял только audio_streaming (v2.52.2–2.52.3)»Таймер простоя не учитывал транспортное состояние playing из Music Assistant. При переподключении сервера (каждые ~55 мин) оба флага кратковременно сбрасывались.
Исправление (v2.52.3, PR #121): Таймер реагирует на переходы playing и перепроверяет оба флага при срабатывании. Это первый PR, созданный GitHub Copilot coding agent.
Причина 2: флаги сбрасываются при реконнекте (v2.52.4)
Заголовок раздела «Причина 2: флаги сбрасываются при реконнекте (v2.52.4)»Двухуровневый fallback: MA WebSocket monitor (первичный) + буфер истории событий (запасной).
Причина 3: флаги демона ненадёжны в принципе (v2.53.0)
Заголовок раздела «Причина 3: флаги демона ненадёжны в принципе (v2.53.0)»Настоящий авторитет — сам PulseAudio-синк: если аудиосемплы текут в BT-синк, он в состоянии running; если нет — idle или suspended.
Архитектура SinkMonitor (v2.53.0-rc.1):
SinkMonitor подписывается на события PA-синков через pulsectl_asyncio, отслеживает состояние всех Bluetooth-синков, вызывает коллбэки на переходах running ↔ idle. Начальное сканирование при подключении к PA предотвращает устаревшие данные.
WebSocket heartbeat (v2.53.0-rc.2)
Заголовок раздела «WebSocket heartbeat (v2.53.0-rc.2)»Обнаружен отдельный сбой: server-initiated WebSocket-соединение Sendspin не имело heartbeat, прокси и файрволы молча разрывали idle-соединения. Теперь демон шлёт 30-секундный ping/pong.
Также исправлено: Issue #119 — non-ASCII авторизация MA (v2.52.2)
Заголовок раздела «Также исправлено: Issue #119 — non-ASCII авторизация MA (v2.52.2)»Китайский пользователь @geniusliang сообщил о краше при входе в MA через Ingress с CJK-именем. Исправлено percent-кодированием non-ASCII символов.
Хронология релизов
Заголовок раздела «Хронология релизов»| Версия | Дата | Ключевое изменение |
|---|---|---|
| 2.52.2 | 1 апр | Non-ASCII MA auth (#119) |
| 2.52.3 | 1 апр | Таймер реагирует на playing (#120) |
| 2.52.4 | 2 апр | Двухуровневый fallback (#120) |
| 2.53.0-rc.1 | 2 апр | SinkMonitor заменяет 3-уровневый guard (#120) |
| 2.53.0-rc.2 | 3 апр | WebSocket heartbeat |
Почему это важно
Заголовок раздела «Почему это важно»Первый реальный баг-репорт, вскрывший фундаментальную архитектурную слабость. SinkMonitor — качественное улучшение: он опрашивает аудиосистему напрямую, а не выводит состояние из флагов подпроцесса. Это фундамент для power save режима в v2.55.0.
Четыре версии за два дня — благодаря детальным логам и диагностике от пользователя.