-
-
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!