Перейти к содержимому

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 предотвращает устаревшие данные.

Обнаружен отдельный сбой: 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.21 апрNon-ASCII MA auth (#119)
2.52.31 апрТаймер реагирует на playing (#120)
2.52.42 апрДвухуровневый fallback (#120)
2.53.0-rc.12 апрSinkMonitor заменяет 3-уровневый guard (#120)
2.53.0-rc.23 апрWebSocket heartbeat

Первый реальный баг-репорт, вскрывший фундаментальную архитектурную слабость. SinkMonitor — качественное улучшение: он опрашивает аудиосистему напрямую, а не выводит состояние из флагов подпроцесса. Это фундамент для power save режима в v2.55.0.

Четыре версии за два дня — благодаря детальным логам и диагностике от пользователя.