-
-
Save hxss/a3eadb0cc52e58ce7743dff71b92b297 to your computer and use it in GitHub Desktop.
| # /etc/udev/rules.d/20-bt-auto-enable-a2dp.rules | |
| # hxss | |
| SUBSYSTEM=="bluetooth", ACTION=="add", RUN+="/home/hxss/.config/scripts/xorg/bt-auto-enable-a2dp.sh" |
| #!/bin/sh | |
| # Dependencies: | |
| # * bluez-tools | |
| # * expect | |
| # * perl | |
| function enable_a2dp() { | |
| # run connect command in bluetoothctl and wait for resolve of services | |
| expect <<< " | |
| spawn bluetoothctl | |
| send \"connect $mac\r\" | |
| log_user 0 | |
| expect -re \".*Device $mac ServicesResolved: yes\" | |
| " | |
| # enable card in pulseaudio | |
| pactl set-card-profile $pulsecard a2dp_sink | |
| logger -p info "mac $mac enabled" | |
| headsetname=`bt-device -l | perl -ne '/(.*) \('$mac'\)/ and print "$1\n"'` | |
| notify-send 'Headset connected' "$headsetname" --icon=blueman-headset | |
| } | |
| function search_headsets() { | |
| sleep 1 | |
| # in all added devices | |
| for mac in `bt-device -l | perl -ne '/.*\((.*)\)/ and print "$1\n"'` | |
| do | |
| # search for connected device with AudioSink service | |
| if [[ `bt-device -i $mac | perl -00 -ne '/.*Trusted: 1.*\n\s*Blocked: 0.*\n\s*Connected: 1\n\s*UUIDs: .*AudioSink.*/ and print "1\n"'` ]]; then | |
| logger -p info "found mac: $mac" | |
| # convert mac to pulse card name | |
| pulsecard=`perl -pe 's/:/_/g' <<< "bluez_card.$mac"` | |
| enable_a2dp | |
| fi | |
| done | |
| echo "search done" | |
| } | |
| logger -p info "${BASH_SOURCE[0]}" | |
| # get script owner name | |
| user=`stat -c %U $0` | |
| if [ "$user" == `whoami` ]; then | |
| # if script runned by owner - start main function | |
| search_headsets | |
| elif [ "`w -hs $user`" ]; then | |
| # else if user session exist(to prevent running on system startup) - run script from user | |
| machinectl shell --uid=$user .host ${BASH_SOURCE[0]} | |
| fi | |
Side note: For me (Manjaro) it wasn't the package bluez-tools. I needed bluez-utils.
Also thank you very much for that script <3
Nice, I should try this. Would you mind adding a license to your gist, if it work well (and your license allows), I might package it for nixos. Here's an example of what people seem to do to license their gist:
https://gist.github.com/martinbuberl/c0de29e623a1e34d1cda7e817d18bafe
I don't know what I am missing but I can get this to work on Manjaro. My headphones always default to SBC even if I have needed ldac modules etc installed.
Great workaround! For my case (using Linux Mint 19.1, based on Ubuntu), I had to add some extra steps:
a. changing line 1 of the script #!/bin/sh to #!/bin/bash (as sh in Mint/Ubuntu is a very basic shell interpreter, unable to follow your script)
b. creating a systemd service pointing to your script named "auto-enable-a2dp.service" (see: https://www.pcsuggest.com/run-shell-scripts-from-udev-rules/)
c. changing line 3 of the rule, replacing RUN with TAG+="systemd", ENV{SYSTEMD_WANTS}="auto-enable-a2dp.service"
d. installing a last dependency 'sudo apt install systemd-container'
It is still possible to debug the service by tapping 'systemctl status auto-enable-a2dp.service'
Worked for me. Thanks :)
peacecop@peacecop-HP-ProBook-4520s:~$ ./bt-auto-enable-a2dp.sh
./bt-auto-enable-a2dp.sh: 8: Syntax error: "(" unexpected
It Works well on Manjaro KDE.
Works great in Manjaro linux. Thanks for that script!