Устройства и адаптеры
Empty state и первый запуск
Заголовок раздела «Empty state и первый запуск»
Если bridge уже видит Bluetooth-адаптер, но ни одной колонки ещё не настроено, dashboard показывает Scan for devices. Этот shortcut теперь переводит прямо в Configuration → Devices → Discovery & import и сразу запускает сканирование.
Если же адаптер вообще не найден, empty state предлагает Add adapter, открывает Configuration → Bluetooth, создаёт пустую строку адаптера и ставит фокус в первое поле.
Добавление колонки
Заголовок раздела «Добавление колонки»
Рекомендуемый сценарий такой:
- Откройте Configuration → Devices.
- Нажмите Scan в карточке Discovery & import.
- В результатах выберите Add или Add & Pair.
- Заполните имя плеера и дополнительные поля.
- Сохраните конфиг и при необходимости выполните перезапуск.
Поведение сканирования
Заголовок раздела «Поведение сканирования»- Сканирование идёт в фоне и интерфейс периодически опрашивает результат.
- Найденные устройства можно сразу добавить в fleet table.
- Add & Pair выполняет pairing/trust/connect до добавления строки в конфиг.
- После завершения сканирования кнопка уходит в cooldown и не даёт спамить повторные попытки.

Already paired
Заголовок раздела «Already paired»Блок Already paired позволяет импортировать устройства, которые хост уже знает, без повторного сканирования.

Таблица Device fleet
Заголовок раздела «Таблица Device fleet»Device fleet — основное место для управления колонками.
| Колонка | За что отвечает |
|---|---|
| Enabled | Временно исключает устройство из запуска |
| Player name | Имя в Music Assistant |
| MAC | Bluetooth-адрес |
| Adapter | Привязка к конкретному контроллеру |
| Port | Пользовательский sendspin listener port |
| Delay | static_delay_ms |
| Live | Runtime badge из работающего bridge |
| Remove | Удаление строки из конфига |
При раскрытии строки появляются advanced-поля: preferred format, listen host и keepalive interval.
Порты, host и keepalive на уровне устройства
Заголовок раздела «Порты, host и keepalive на уровне устройства»Текущий device-flow использует такие network/runtime-поля:
| Поле | Текущее поведение |
|---|---|
listen_port | Если задан, устройство всегда использует именно этот порт |
listen_host | Переопределяет advertised host/address для listener’а этого устройства |
keepalive_interval | Любое положительное значение включает keepalive-тишину; всё меньше 30 секунд поднимается до 30 |
keepalive_silence | Legacy-совместимое поле из старых addon-конфигов; отдельного переключателя для него в текущем web UI больше нет |
Если listen_port пуст, runtime использует BASE_LISTEN_PORT + индекс устройства. Каждый эффективный listener port должен быть уникальным. Для multi-bridge setups на одном хосте либо задавайте разный диапазон BASE_LISTEN_PORT для каждого bridge, либо указывайте явные listen_port для всех колонок.
listen_host полезен в первую очередь там, где Music Assistant должен подключаться к bridge по адресу, отличному от автоопределённого.
Управление адаптерами
Заголовок раздела «Управление адаптерами»
Во вкладке Bluetooth доступны:
- понятные имена адаптеров,
- ручные adapter entries,
- refresh detection,
- policy-параметры восстановления,
- переключатель Prefer SBC codec.
Привязка колонки к адаптеру
Заголовок раздела «Привязка колонки к адаптеру»В поле Adapter можно указывать:
hci0,hci1и т.д.,- или MAC-адрес адаптера.
Использование MAC особенно удобно в LXC-окружениях, где имя hciN может меняться после перезагрузки.
Глубокие ссылки из dashboard
Заголовок раздела «Глубокие ссылки из dashboard»Dashboard теперь возвращает вас в точное место редактирования, а не просто открывает общий раздел:
- Шестерёнка устройства → подсвечивает нужную строку в Configuration → Devices.
- Shortcut/gear адаптера → подсвечивает нужную строку в Configuration → Bluetooth.
- Бейдж группы → открывает соответствующие настройки группы в Music Assistant в новой вкладке.
Режимы сетки и списка
Заголовок раздела «Режимы сетки и списка»Один и тот же fleet можно просматривать в двух layout’ах:
- Режим сетки для небольшого числа устройств.
- Режим списка для больших fleet’ов, с sortable columns и expandable rows.
По умолчанию bridge переключается в режим списка, если видно больше 6 устройств, но ваш ручной выбор запоминается в браузере и используется при следующем открытии.
Re-pair, Release и Reclaim
Заголовок раздела «Re-pair, Release и Reclaim»
Из dashboard доступны такие действия:
| Действие | Когда использовать |
|---|---|
| Reconnect | Нужно принудительно переподключить BT без правки конфига |
| Re-pair | Pairing/trust state на хосте сломано или устарело |
| Release | Нужно временно вернуть колонку телефону или ПК |
| Reclaim | Нужно снова отдать Bluetooth-управление bridge |
Release не удаляет устройство из конфига — bridge просто перестаёт активно его переподключать до нажатия Reclaim.
Это отличается от других похожих действий:
| Действие | Что меняется |
|---|---|
| Release | Только runtime hand-off; устройство остаётся в конфиге и быстро возвращается через reclaim |
| Disable | Конфигурируемый пропуск устройства на старте; строка остаётся в fleet table |
| Unpair / Re-pair | Меняется Bluetooth trust state на уровне хоста |
Если все настроенные колонки сейчас released, onboarding/recovery surfaces могут показать fleet-level reclaim action, чтобы быстро вернуть bridge ownership без обхода каждой строки вручную.
Политика reconnect и auto-disable
Заголовок раздела «Политика reconnect и auto-disable»Во вкладке Bluetooth есть два параметра, которые напрямую влияют на доступность устройств:
- BT check interval задаёт частоту проверки и попыток Bluetooth-восстановления.
- Auto-disable threshold может сохранить устройство в disabled-состоянии после серии неудачных reconnect.
Если колонка постоянно флапает, bridge может auto-disable её, чтобы защитить остальную группу. После устранения причины Bluetooth-проблемы включите устройство снова в Configuration → Devices.
Delay tuning и keepalive
Заголовок раздела «Delay tuning и keepalive»Для сложных колонок особенно полезны такие поля:
static_delay_ms— декларирует, сколько дополнительной задержки железо этой колонки добавляет после PulseAudio / PipeWire-sink, в который пишет bridge (BT-радио, кодек, DSP колонки, усилитель). Согласно Sendspin-протоколу, клиент вычитает это значение из времени проигрывания каждого чанка, поэтому аудио отдаётся на железо раньше ровно наstatic_delay_msмиллисекунд; железо добавляет свою реальную задержку обратно, и акустический выход приходит на запланированный таймштамп. В web UI для каждого нового устройства по умолчанию подставляется 300 мс — это разумная стартовая оценка задержки BT-пайплайна за sink’ом у типичных потребительских колонок, и полевые отчёты показали, что 300 мс заметно лучше0для A/V-синхронизации, особенно на Ubuntu / PipeWire-хостах. Увеличивайте значение для колонок, которые стабильно отстают от остальных в группе (слышно, что их выход опаздывает на несколько сотен мс) — это значит, что их реальная hw-задержка больше, чем компенсирует текущийstatic_delay_ms. Уменьшайте — для колонок, которые опережают группу. Отрицательные значения не принимаются: sendspin 7.0+ их отклоняет, а legacy-отрицательные значения в импортируемом конфиге при миграции клампятся в0. Диапазон —0–5 000 мс; дешёвым BT-колонкам с большими внутренними jitter-буферами могут понадобиться значения, близкие к 1 000 мс.keepalive_interval— периодическая тишина, чтобы некоторые колонки не засыпали между треками.keepalive_silence— legacy-boolean из старых addon-конфигов; сейчас keepalive фактически управляется черезkeepalive_interval > 0.keep_alive_method— способ, которым bridge удерживает колонку в активном состоянии при включённом keep-alive:infrasound(по умолчанию) — отправляет почти неслышимую 2 Hz пульсацию. Работает на колонках, которые в power-save заглушают обычную тишину.silence— отправляет чистую цифровую тишину. Минимальное влияние на качество, но не сработает на колонках, глушащих линию при нулевых сэмплах.none— отключает активную эмиссию полностью; режим «держим BT-линк, но молчим». Подходит для колонок, которые сами по себе не засыпают.
preferred_format— уменьшает ресэмплинг или нагрузку CPU в зависимости от настроек MA.
Измерение латентности каждой колонки через MassDroid
Заголовок раздела «Измерение латентности каждой колонки через MassDroid»Для сложных многоспикерных групп подбор static_delay_ms чисто на слух — долгий процесс. Ускорить его помогает измерение реального round-trip времени (RTT) каждой колонки через MassDroid — сторонний нативный Android-клиент Music Assistant со встроенной акустической калибровкой. Использовать его нужно как диагностический инструмент, а не как прямой источник значений static_delay_ms.
Что именно измеряет MassDroid. После калибровки самого телефона как baseline MassDroid проигрывает шесть тональных импульсов 1 кГц через сопряжённую BT-колонку и записывает их обратно через микрофон. Нативный C++ DSP-пайплайн ловит начало каждого тона через bandpass-фильтрацию и envelope SNR, усредняет и выдаёт:
BT delay— абсолютный round-trip в миллисекундах (отправка сэмпла → DAC → транспорт → воздух → микрофон). Для типичных BT-колонок результат ~150–400 мс.+X ms over phone— сколько из этого приходится на сам BT-путь (поверх baseline телефона).- Quality —
GOOD,MARGINALилиFAILED(по количеству пойманных тонов, разбросу между ними и SNR).
Почему это число нельзя подставить 1 : 1. MassDroid меряет полный акустический round-trip (DAC + транспорт + воздух + захват микрофоном). Sendspin-овский DAC-anchored sync уже забирает на себя ту часть пайплайна, которую видит PulseAudio / PipeWire; плюс mic-capture — это уже не сторона моста. Переносится другое — порядок и разница RTT между колонками: в группе колонка с максимальным RTT имеет больше всего невидимой остаточной hw-задержки и должна нести самый большой static_delay_ms; колонкам с меньшим RTT нужно меньшее значение.
Рекомендуемый порядок:
- Поставьте MassDroid на телефон с Android 8.0+ и укажите тот же MA-сервер.
- В MassDroid откройте плеер Sendspin (local) → меню «⋮» → Player Settings → сначала запустите Phone speaker calibration (обязательный baseline: Bluetooth отключён, громкость медиа 50–70 %, комната тихая).
- Последовательно сопрягайте телефон напрямую с каждой из проблемных BT-колонок и запускайте Bluetooth device calibration. Принимайте только результаты с оценкой
GOOD; приMARGINAL/FAILED— повторите, поднеся телефон ближе и снизив шум. - Запишите BT delay каждой колонки. Колонка с максимальным значением — самая «медленная» по железу: у неё больше всего некомпенсированной задержки за sink’ом.
- В качестве отправной точки поднимайте
static_delay_msу каждой колонки примерно наthis_rtt − min_rttсверх текущего дефолта, чтобы каждая колонка декларировала задержку, близкую к её реальной hw-латентности. Например, если одна колонка даёт 180 мс, другая 260 мс — поставьте «260-мсной» примерно на 80 мс больше, чем «180-мсной». - Доведите на слух в групповом воспроизведении. Изменения применяются на лету через IPC-команду
set_static_delay_ms— перезапуск демона не требуется.
Standby и Wake-on-play
Заголовок раздела «Standby и Wake-on-play»Bridge поддерживает idle standby: после настраиваемого периода тишины Bluetooth-соединение разрывается, а колонка переходит в режим ожидания. Плеер MA остаётся видимым, и при запуске воспроизведения bridge автоматически переподключается («wake-on-play»).
Как это работает
Заголовок раздела «Как это работает»- Установите Idle standby (min) в раскрытой строке устройства (Configuration → Devices). Значение
0— всегда подключено. - По истечении заданного времени тишины bridge отключает Bluetooth и перенаправляет аудио на null sink PulseAudio.
- На карточке устройства появляется бейдж 💤 Standby и кнопка ☀️ Wake.
- Когда MA отправляет команду воспроизведения, bridge автоматически переподключает Bluetooth (~5 с задержки).
- Участники sync-группы будят друг друга: если одно устройство просыпается, остальные следуют за ним.
Auto-off колонки и глубокий сон
Заголовок раздела «Auto-off колонки и глубокий сон»Длительность этого окна подключения полностью зависит от прошивки колонки и не может быть изменена мостом:
| Категория | Примеры | Окно подключения |
|---|---|---|
| Стационарные (от сети) | Sonos, Marshall Stanmore/Woburn, умные колонки | Бесконечно (всегда включены) |
| Аккумуляторные, auto-off выключен | Sony XM4/5, Bose SoundLink, JBL (через companion-приложение) | До разряда батареи (6–24 ч) |
| Аккумуляторные, auto-off настраивается | Sony (5 мин–3 ч), Bose (5–60 мин), JBL (10–60 мин) | Зависит от настройки |
| Аккумуляторные, фиксированный auto-off | IKEA ENEBY/SYMFONISK (~15–20 мин), бюджетные колонки | Нельзя изменить |
Отключение auto-off на колонке
Заголовок раздела «Отключение auto-off на колонке»Многие колонки позволяют отключить или увеличить таймер auto-off через companion-приложение или комбинацию кнопок:
- Sony — Sony Headphones Connect → System → Auto Power Off → Do not turn off
- Bose — Bose app → Settings → Auto-Off → Never, или удержание кнопки Mute 10 с
- JBL — JBL Portable / JBL One app → Settings → Auto-Off → Disable
- Jabra — Jabra Sound+ app → Headset settings → Auto-off
Команды Bluetooth-протокола для изменения этого параметра не существует — настраивать нужно на самом устройстве.
Рекомендации
Заголовок раздела «Рекомендации»- Для стационарных колонок: idle standby работает отлично при любом таймауте.
- Для аккумуляторных с отключённым auto-off: настраивайте idle standby свободно; wake-on-play будет работать до разряда батареи.
- Для колонок с фиксированным auto-off: ставьте
idle_disconnect_minutesменьше таймера auto-off колонки, чтобы bridge успел переподключиться до глубокого сна. - Keep-alive и idle standby взаимоисключающи — при включённом keep-alive idle standby автоматически отключается.
Взаимоисключение с keep-alive
Заголовок раздела «Взаимоисключение с keep-alive»Keep-alive отправляет периодическую тишину, чтобы колонка не засыпала. Idle standby намеренно отключает соединение после тишины. Эти две функции преследуют противоположные цели, поэтому одновременно активна может быть только одна:
- В UI включение одной отключает другую.
- Если обе заданы в конфиге, keep-alive имеет приоритет — idle-таймер пропускается (предупреждение в логе при старте).