
Я використовую Xubuntu яка має XFCE за основу налаштувань робочого столу. І у ній можливо швидко перемикати користувачів за допомогою гарячих клавіш, без необхідності блокувати поточного користувача. Хоткеї Ctrl+Alt+F7 (F8, F9, F10, F11).
Pulseaudio працює окремо ізольовано для кожного користувача і не міксуються один з одним. Це ж добре.
Але bluetooth тут є проблема: коли ви підключаєетесь до вже зпаренного блютуз девайсу він може приконнектитись до ІНШОГО залогіненого юзера. Як вм це можете перевірити? Профілі блютузу не будуть доступні при првому кліку мишею по апплету в bluetooth-manager.
Є досить невеликий відсоток успіху для ручного виправлення цього багу: роз'єднати, видалити, шукати і додавати блютуз девайс знову і знову. І знову.
Я помітив у логах, що rtkit-daemon відриває потік НЕ ДЛЯ активного у даний момент користувача!
# tail -f /var/log/syslog rtkit-daemon[1882154]: Successfully made thread 1882287 of process 33259 owned by '1003' RT at priority 5.
Першою моєю спробою пофіксити був скрипт який а автоматичному режимі перепідключав девайс.
https://gist.github.com/onesixromcom/4928c71afe0fadbec07ef893a1027000
Але це не спрацьовувало з першого разу. Що мене доволі підбішувало. Особливо коли з хвилини на хвилину мав початись зідзвон.
Тому я продовжив пошуки рішення.
Автивував логування для bluettohd:
$ sudo nano /usr/lib/systemd/system/bluetooth.service ExecStart=/usr/libexec/bluetooth/bluetoothd -d $ sudo systemctl daemon-reload $ sudo systemctl restart bluetooth.service
Активував режим відлагодження для rtkit-daemon:
$ sudo systemctl edit rtkit-daemon [Service] LogLevelMax=warning $ sudo systemctl restart rtkit-daemon
І знайшов цікаву строку:
bluetoothd[1877627]: profiles/audio/transport.c:media_transport_set_owner() Transport /org/bluez/hci0/dev_12_12_12_12_12_12/sep1/fd0 Owner :1.7027
Де записано "Owner :1.531".
Я перевірив поточні id користувачів:
$ busctl | grep pulseaudio :1.7027 1894100 pulseaudio user3 :1.7027 user@1003.service - - :1.7031 1894114 pulseaudio user1 :1.7031 user@1000.service - - :1.7034 1894116 pulseaudio user2 :1.7034 user@1002.service - -
Як я зрозумів з похідного коду - девай буде прикріплений для першого користувач зі списку.
Це можна побачити в фунції lookup_client() в rtkit-daemon.c.
https://github.com/heftig/rtkit/blob/master/rtkit-daemon.c#L1037
Для того щоб виправити нашу помилку необхідно поставити поточного користувача у верх списку. Для цього ми приб'ємо всі pulseaudio процессі і запустимо їх знову. Інші користувачі будуть додані згодом автоматичено цим демоном.
$ sudo killall pulseaudio $ systemctl --user start pulseaudio.service
Переглянути Gist з кодом
https://gist.github.com/onesixromcom/2a1f4257606d618e9cfbafd8d12f29f4
Перед запуском скрипта девайс має бути знайдено і піключено(довірено).
Це вирішило проблему! Тепер я можу перемикатись на будь-якого користувача, запускати скрипт і мати звук у навушниках!
Корисні посилання:
https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/tree/master/src
https://github.com/bluez/bluez
https://github.com/heftig/rtkit