Представляю MagicPods для Linux 1 июня 2026 г. | 5 мин Читать

Представляю MagicPods для Linux

Valve невероятно впечатлила меня выходом Steam Deck, и еще в 2024 году я разработал плагин MagicPodsDecky для игрового режима Steam Deck. А анонсом Steam Machine Valve смогли впечатлить меня еще больше, и так родилась идея портировать MagicPods на Linux в виде полноценного нативного приложения, а не очередного Electron/React-монстра, и опубликовать MagicPods в Steam.

О разработке

Под Linux я раньше практически не писал и был знаком в основном только с серверами, так что MagicPods Linux можно считать моим пилотным Linux-проектом.

Первоначально я решил попробовать сделать KDE Plasmoid и посмотреть, как мои пользователи вообще воспримут эту идею. Как оказалось, довольно много людей пользуется SteamOS.

MagicPodsPlasmoid, запущенный на SteamOS

Следующим этапом стала разработка основного приложения, которое объединяло бы установку и настройку всех компонентов. Мне хотелось сделать так, чтобы пользователь мог просто установить MagicPods и бесшовно пользоваться им как в десктопном, так и в игровом режиме SteamOS. Уже примерно через месяц был готов первый билд приложения, включающий:

  • MagicPods — интерфейс для десктопного режима
  • MagicPodsPlasmoid — виджет с быстрыми настройками для трея десктопного режима
  • MagicPodsDecky — интерфейс для игрового режима
  • MagicPodsCore — общий фоновый сервис для работы с наушниками, используемый всеми вышеописанными компонентами

С работой DBus и исправлением некоторых ошибок в коде мне помогал Андрей Литвинцев. Также он тестировал мой UI на своей системе. Мы довольно сильно переработали возможности MagicPodsCore, добавив работу с BLE, сохранение настроек и поддержку новых вышедших моделей AirPods и Beats.

Финальная версия интерфейса MagicPods на KDE

Все работало и выглядело отлично в стиле KDE, а само приложение вместе со всем контентом занимало всего около 60 МБ. На минутку — это 40 анимаций, изображения наушников, иконки и все компоненты, включенные в приложение.

Но потом я столкнулся с требованиями публикации в Steam. Вкратце — приложение должно быть полностью автономным, содержать все необходимое внутри билда и не зависеть от библиотек операционной системы. И самое главное — тестирование сначала проходит в Linux, а только потом в SteamOS. Следовательно, нельзя опубликовать приложение только для SteamOS, несмотря на настройки в админке Steam и успешную работу приложения через Steam.

Демонстрация работы MagicPods, запущенного через Steam на Steam Deck

Следующие два месяца я практически полностью перепроектировал и переписал приложение. Пришлось отказаться от части функций, включая MagicPodsPlasmoid, заменив его трей-иконкой. А запуск общего фонового сервиса вообще пришлось немного «закастылить» через само приложение и Decky-плагин. Сам MagicPodsDecky теперь необходимо устанавливать через магазин Decky Loader.

Вдобавок приходится тащить с собой огромное количество библиотек для независимого запуска приложения, из-за чего размер приложения вырос почти до 200 МБ. Это позволило запускать приложение на Linux, по крайней мере на SteamOS, Kubuntu и Ubuntu.

Самой сложной и до сих пор не идеально решенной задачей стала поддержка High DPI мониторов. В KDE приложение выглядело прекрасно, но в других окружениях и особенно в игровом режиме SteamOS интерфейс отображался мыльно, а некоторые цвета отображались некорректно вне зависимости от выбранной темы.

Значки и подписи уровня заряда отображаются неверным цветом, несмотря на темную тему

Более того, на Ubuntu мне так и не удалось вернуть тень под окном приложения, потому что при включении тени приложение становилось размытым, а если делать приложение четким — тень исчезала. Выбирая между тенью и четкостью интерфейса, я выбрал второе.

Тень от окна не отображается на Ubuntu

И так было буквально со всем. Меняешь одно — ломается другое. После пары сотен попыток мне удалось подобрать плюс-минус универсальные настройки.

Финальным этапом стали бесконечные правки текста, скриншотов и описания для страницы приложения в Steam. Именно поэтому на некоторых скриншотах можно заметить довольно забавные названия наушников.

В итоге разработка приложения заняла около шести месяцев практически без выходных и в среднем при 10-часовом рабочем дне. Но стоит учитывать, что параллельно я еще занимался обновлениями основного приложения, плагина и других своих проектов.

Приложение и функции

В основе MagicPods лежит MagicPodsCore — мой фоновый сервис для управления AirPods, Beats, Galaxy Buds и другими Bluetooth-наушниками, написанный на C++, а сам интерфейс MagicPods построен на Qt и C++.

На данный момент я реализовал практически весь функционал, доступный в MagicPodsCore, а часть возможностей даже немного расширил.

Интерфейс MagicPods

Главное нововведение — поддержка анимаций для AirPods и Beats. Работает эта функция немного иначе, чем в Windows-версии. Необходимо один раз подключить наушники для первоначальной настройки, после чего анимация и отображение уровня заряда будут работать практически как на iPhone.

Демонстрация анимации

Интерфейс состоит из двух частей:

  • детальные настройки в основном окне приложения;
  • быстрые настройки по клику на трей-иконку.
Интерфейс на примере AirPods Pro 3

Большинство привычных функций: управление шумоподавлением, индивидуальная громкость, настройка длительности нажатий, громкости тонов и многое другое — прекрасно работают для моделей AirPods и наушников Beats.

Некоторые функции работают с оговорками. Например, одиночное/двойное нажатие для управления звонками можно настроить, но работать эти настройки будут только на iPhone/iPad/Mac. При подключении к другим устройствам они недоступны.

Функция «Распознавание разговора» работает, но управление звуком пока реализовано только внутри MagicPodsDecky. В будущем я планирую перенести эту функцию непосредственно в MagicPodsCore, чтобы она не зависела от игрового режима SteamOS.

Уведомления и локализация в первый релиз не вошли. Пока я не до конца разобрался в особенностях реализации этих функций в Linux, но планирую добавить их в будущих обновлениях.

Отдельное внимание я уделил управлению кодеками. Функция доступна для всех наушников и зависит от поддерживаемых кодеков в системе. В большинстве случаев Linux сам выбирает лучший вариант, но при желании пользователь может вручную переключить Bluetooth-кодек на предпочтительный.

Выбор Bluetooth-кодека для Galaxy Buds 3 Pro

Определение системной темы в Linux — отдельная головная боль. Если цвет иконок не совпадает с вашим оформлением, в настройках MagicPods можно вручную выбрать светлую или темную тему.

Поддерживаемые наушники

Следующие наушники из списка имеют поддержку расширенных функций, а для большинства остальных наушников доступно отображение уровня заряда и переключение Bluetooth-кодеков.

Apple Beats Samsung
AirPods 1 PowerBeats Pro Galaxy Buds
AirPods 2 PowerBeats Pro 2 Galaxy Buds Plus
AirPods 3 PowerBeats 3 Galaxy Buds Live
AirPods 4 PowerBeats 4 Galaxy Buds Pro
AirPods 4 (ANC) Beats Fit Pro Galaxy Buds 2
AirPods Pro Beats Studio Buds Galaxy Buds 2 Pro
AirPods Pro 2 Beats Studio Buds Plus Galaxy Buds Fe
AirPods Pro 3 Beats Studio Pro Galaxy Buds 3
AirPods Max Beats Solo 3 Galaxy Buds 3 Pro
AirPods Max 2024 Beats Solo Pro
AirPods Max 2 Beats Studio 3
Beats X
Beats Flex
Beats Solo Buds
Powerbeats Fit

В заключение

Мои проекты MagicPodsLinux, MagicPodsDecky и MagicPodsCore имеют открытый исходный код, так что при желании вы можете самостоятельно добавить поддержку дополнительных моделей устройств.

MagicPods для Linux уже доступен в Steam.