upnpvol
upnpvol — синхронизатор громкости между сервером MPD и UPnP/DLNA-устройством (медиаплеером, ЦАПом или усилителем с поддержкой UPnP MediaRenderer).
Программа работает как системный демон: подписывается на события UPnP (через event subscription) и на события idle MPD, и поддерживает громкость обеих сторон в согласованном состоянии.
- Лицензия: BSD-3-Clause
- Язык: Go (требуется версия 1.26 или новее)
- Зависимости: полностью вендорятся в
src/vendor/, сборка не требует сети
Режимы работы
Режим сканирования (--scan)
Поиск UPnP-устройств в локальной сети и выбор одного из них. Выбранный device сохраняется в конфигурацию, после чего его можно использовать в режиме мониторинга.
upnpvol --scan
В интерактивном режиме доступны команды:
| Команда | Описание |
|---|---|
<индекс> |
Выбрать устройство по индексу |
show <индекс> |
Показать подробности об устройстве |
test <индекс> |
Проверить устройство (управление громкостью) |
list |
Повторно показать список устройств |
scan |
Повторить сканирование сети |
quit / exit |
Выход |
Режим мониторинга (--monitor)
Синхронизация громкости ранее выбранного устройства с MPD. В этом режиме программа работает как демон, завершается по SIGINT/SIGTERM.
upnpvol --monitor
Параметры командной строки
| Флаг | Значение по умолчанию | Описание |
|---|---|---|
-a, --address |
localhost |
IP-адрес сервера MPD |
-p, --port |
6600 |
Порт сервера MPD |
-P, --password |
(пусто) | Пароль сервера MPD |
-s, --scan |
false |
Сканировать сеть и выбрать устройство |
-m, --monitor |
false |
Мониторить ранее выбранное устройство |
-r, --priority |
mpd |
«Источник истины» после [повторного] подключения сторон: device или mpd |
-v, --version |
— | Показать информацию о версии |
Значения, переданные в командной строке, переопределяют глобальный конфигурационный файл — но только если флаг указан явно.
Конфигурация
Глобальный конфигурационный файл: /etc/upnpvol.conf (образец — в packaging/upnpvol.conf). Основные параметры:
mpd_host = localhost # адрес MPD
mpd_port = 6600 # порт MPD
mpd_password = # пароль MPD
upnp_port = 8080 # TCP-порт для входящих UPnP-событий
upnp_timeout = 1800 # таймаут подписки, секунд
priority = mpd # device | mpd
log_file = /var/log/upnpvol/upnpvol.log
log_level = 3 # 0 = ошибки ... 4 = отладка
log_to_console = true
log_to_file = true
Сборка
Требования
- Go >= 1.26
- GNU make
Основные команды
make release # сборка бинарника без отладочной информации (в bin/upnpvol)
make debug # сборка с отладочными символами
make test # запуск тестов
make verify # проверка согласованности go.mod/go.sum/vendor/
make deps # пересинхронизировать go.mod/go.sum и vendor/ после смены импортов
make dist # собрать исходный tarball в dist/ (для rpmbuild)
make distcheck # распаковать tarball и собрать его офлайн
make clean # удалить артефакты сборки
Готовый бинарник появляется в bin/upnpvol.
Прямая сборка через Go
cd src
CGO_ENABLED=0 go build -mod=vendor -o ../bin/upnpvol main.go
Сборка RPM-пакета
Spec-файл предназначен для сборки под Альт линукс. Для сборки нужно настроить hasher по инструкции. Затем создать каталоги rpm:
mkdir -p ~/RPM/{SOURCES,SPECS}
Далее нужно скачать tar-архив с программой и положить его в ~/RPM/SOURCES, из архива нужно извлечь upnpvol.spec и положить его в ~/RPM/SPECS. Затем следует подготовить apt для сборки под архитектуру aarch64 (если сборка будет происходить на машине с архитектурой, отличной от aarch64):
mkdir -p ~/apt
tee ~/apt/apt.conf.p11.aarch64 > /dev/null <<EOF
Dir::Etc::main "/dev/null";
Dir::Etc::parts "/var/empty";
Dir::Etc::SourceParts "/var/empty";
Dir::Etc::sourcelist "/home/andrew/apt/sources.list.p11.aarch64";
APT::Acquire::Retries "3";
EOF
tee ~/apt/sources.list.p11.aarch64 > /dev/null <<EOF
rpm http://ftp.altlinux.org/pub/distributions/ALTLinux/p11/branch aarch64 classic
rpm http://ftp.altlinux.org/pub/distributions/ALTLinux/p11/branch noarch classic
EOF
Затем нужно собрать src.rpm-пакет:
rpmbuild -bs --nodeps --target=aarch64 ~/RPM/SPECS/upnpvol.spec
И, наконец, собрать rpm-пакет:
hsh --lazy-cleanup --apt-config=$HOME/apt/apt.conf.p11.aarch64 --with-qemu=aarch64 --target=aarch64 --no-sisyphus-check=packager,gpg,changelog ~/hasher ~/RPM/SRPMS/upnpvol-1.0.0-alt1.src.rpm
Работа с программой
Все команды следуем выполнять от пользователя root. Для понижения прав в режиме –monitor используется функционал systemd (параметр User=_upnpvol в файле upnpvol.service). В режиме –scan права сохраняемому файлу задаются в зависимости от наличия данного параметра в upnpvol.service.
# 1. Найти и выбрать UPnP-устройство
upnpvol --scan
# 2. Запустить синхронизацию вручную
upnpvol --monitor
# Или как systemd-сервис:
systemctl enable --now upnpvol