Skip to content

agent: optional Capsula Mini volume via capsule-ipc - #15

Closed
ryysel wants to merge 1 commit into
yawaflua:masterfrom
ryysel:pr/capsulaipc
Closed

ryysel wants to merge 1 commit into
yawaflua:masterfrom
ryysel:pr/capsulaipc

Conversation

@ryysel

@ryysel ryysel commented Oct 31, 2026

Copy link
Copy Markdown
Contributor

Adds an optional volume backend for the VK Capsula Mini. The device panel uses capsule-ipc VOL, and that is the only path that keeps the panel, ALSA and AirPlay volume in sync.

The existing amixer backend is untouched and still selected by MARUSYA_MIXER_CONTROL; the new backend is opt-in with MARUSYA_CAPSULE_IPC=1. capsule-ipc GET reports the volume and mute state; VOL also unmutes, like the panel; MUTE is a toggle, so SetMuted reads the current state first.

Tested on a real Capsula Mini: 90 -> 30, 90 -> 80, 90 -> 100. Unit tests use a fake runner; the agent builds.

@yawaflua yawaflua left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Не очень понимаю нужду в использовании сторонней библиотеки для управления звуком.
Как по мне лучше абстрагироваться от использования сторонних библиотек для таких важных функций. Если же данная библиотека/программа используется только для AirPlay - есть смысл переписать коллы, нежели скачивать доп оборудование, за которое мы не можем нести ответственность. Открыто для диалога

@ryysel

ryysel commented Oct 31, 2026

Copy link
Copy Markdown
Contributor Author

Согласен, что ради громкости не хочется тянуть зависимость — но уточню, что там происходит, потому что это не библиотека.

  1. В Go-коде нет сторонней библиотеки: пакет не импортирует ничего, кроме stdlib, и ничего не скачивает. Это exec одного бинарника.
  2. capsule-ipc — не наш и не скачиваемый: это клиент к IPC-сокету твикера (/run/capsule-controls.sock), он приходит в комплекте AirPlay-бандла и уже стоит на колонке. Он нужен потому, что на этой колонке панель, ALSA и AirPlay пишут громкость через твикер: если менять только amixer Master, ползунок на панели и уровень AirPlay расходятся, а capsule-ipc GET ещё и отдаёт mute.
  3. «Переписать коллы» — это реализовать чужой IPC-протокол у себя и потом поддерживать его синхронно с прошивкой. По-моему, вызывать штатный клиент честнее, чем держать у себя реверс протокола.
  4. Поэтому бэкенд opt-in: MARUSYA_CAPSULE_IPC=1. По умолчанию всё как раньше, amixer, на других устройствах ничего не меняется.

Но с идеей абстракции согласен, и она лучше того, что в PR. Переделаю на общий exec-бэкенд, без упоминания Капсулы в коде:

  • MARUSYA_VOLUME_CMD (или флаг -volume_cmd);
  • три вызова: get, set <0..100>, mute <on|off>;
  • у нас в конфиге capsule-ipc, у других — amixer, pactl или свой скрипт.

Тогда ядро вообще не знает про конкретное устройство, а amixer остаётся дефолтом. Если такой вариант ок — обновлю PR #15 в этом виде и переименую в «agent: configurable volume command». Если exec-бэкенд в upstream не нужен — скажи, закрою PR и оставлю это локально.

@yawaflua

Copy link
Copy Markdown
Owner

окей, но только я сделаю пуш не в мастер, а в стейдж ветку
#21 также добавил фикс, если на сервере не установлено capsule-controls.sock

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants