Я разработал MagicPods для Linux и Steam Machines (надеюсь, Valve когда-нибудь выпустит ее).

Это десктопное приложение для SteamOS и Linux, которое позволяет просматривать заряд AirPods, Beats и Galaxy Buds, управлять шумоподавлением, Bluetooth-кодеками и другими настройками наушников. Также MagicPods может работать совместно с плагином MagicPods для Decky Loader, обеспечивая поддержку и в игровом режиме Steam Deck.

Идея проекта

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
MagicPodsPlasmoid, запущенный на SteamOS

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Интерфейс MagicPods
Интерфейс MagicPods

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

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

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

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

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

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

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

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

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

Я разработал MagicPods для Linux и Steam Machines (надеюсь, Valve когда-нибудь выпустит ее).

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

В заключение

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

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

35
20
12
4
2
1
47 комментариев