Я не выдержал и написал индикатор для переключения звуковых устройств (входа/выхода) в Ubuntu.
Сколько лет пользовался Ubuntu и её оболочкой Unity, столько и пытался найти индикатор (application indicator) для удобного переключения звукового устройства. Индикаторов под Unity насоздавали уже вагон и маленькую тележку, включая совершенно бессмысленные, на мой взгляд, но такой насущной вещи, как селектор выхода, так никто и не сподобился разработать. Поэтому каждый раз мне приходилось запускать апплет Sound, ждать, пока он запустится, выбирать нужную вкладку и переключать вход или выход. Особенно часто я пользуюсь переключателем для перенаправления звука на мой Bluetooth-адаптер Logitech, чтобы слушать музыку на хорошей акустике.
В конце концов моё терпение лопнуло, и я занялся изучением принципов работы индикаторов. Быстро выяснилось, что написать индикатор для Unity очень просто, особенно на Python. Так я создал самый первый прототип переключателя, который использовал команду pacmd
для смены выхода (sink), а также разбирал её вывод, чтобы составить список доступных аудиоустройств.
Приложение состояло из сотни строк на Питоне и в принципе работало, но всё-таки это было не очень серьёзно — список устройств сам не обновлялся, на переключение устройства в другом месте индикатор тоже никак не реагировал. Ну и к тому же требовал установленного pulseaudio-utils
.
Всё это было как-то некошерно, так что я взялся за изучение PulseAudio API — очень утомительное увлекательное занятие. Тут надо ещё отметить, что библиотека PulseAudio по своей природе полностью асинхронная, так что обработку её событий очень желательно выполнять в отдельном потоке.
После долгих экспериментов с несколько ущербной реализацией многопоточности в Python (один только GIL чего стоит), я наконец добился полностью стабильной работы индикатора. Меню содержит три секции: входные устройства (отсортированные по имени), выходные устройства (то же самое) и статические пункты.
Значок индикатора сделал в Inkscape:
Любые изменения состояния сервера PulseAudio отражаются на содержимом меню, причём, даже если оно открыто.
Следующей задачей было создать установочный .deb-пакет для Убунту, чтобы приложением могли легко пользоваться все желающие, и вот тут-то меня ждало самое настоящее испытание. Могу с уверенностью сказать, что написать многопоточный индикатор на Питоне заметно проще, чем собрать его в пакет и опубликовать на Launchpad. В Сети множество статей на эту тему, но при их прочтении меня постоянно преследовало ощущение, что все они описывают, как управлять самолётом в воздухе, не объясняя, как, собственно, нужно взлетать (для интересующихся темой настоятельно советую начать с прочтения документации по Distutils, после этого многое становится ясно. Следующим шагом может быть stdeb).
В общем, приложение собрано и доступно:
- Исходный код на GitHub;
- Пакет
indicator-sound-switcher
в моём Launchpad PPA.
Чтобы его установить:
sudo add-apt-repository ppa:yktooo/ppa
sudo apt-get update
sudo apt-get install indicator-sound-switcher
О багах сообщайте в трекер на GitHub. ■
Комментарии