Я використовую 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

Коментувати

Вміст цього поля є приватним і не буде доступний широкому загалу.
  • Не дозволено жодних HTML теґів.