Ich habe die folgende Udev-Regel:
ACTION=="add", SUBSYSTEM=="bluetooth", RUN+="/usr/local/bin/a2dp-fix-wrapper"
das folgende Skript auslöst:
PID=$(pgrep pulseaudio)
USER=$(grep -z USER= /proc/$PID/environ | sed 's/.*=//')
USER_ID=$(id -u $USER)
HOME=$(echo $(getent passwd $USER )| cut -d : -f 6)
export XDG_RUNTIME_DIR=/run/user/$USER_ID
export XAUTHORITY=$HOME/.Xauthority
export DISPLAY=:0
export PULSE_RUNTIME_PATH=$XDG_RUNTIME_DIR/pulse/
sleep 5
sudo -u $USER -E /usr/local/bin/a2dp-fix &> /udev_output.txt
und a2dp-fix ist das Folgende:
bt_device_addr=$(pacmd list-cards | grep -i 'name:.*bluez_card' | sed -E 's/.*<?bluez_card\.([A-Z0-9_]+)>?/\1/')
device_mac=$(echo $bt_device_addr | sed 's/_/:/g')
a2dp_available=$(pacmd list-cards | grep -A30 bluez | grep "A2DP Sink" | sed -E 's/.* available: ([a-z]+)\)/\1/g')
if [[ "$a2dp_available" == "no" ]]
then
echo -e "connect $device_mac\nquit" | bluetoothctl
sleep 5
pacmd set-card-profile bluez_card.$bt_device_addr off
pacmd set-card-profile bluez_card.$bt_device_addr a2dp_sink
pacmd set-default-sink bluez_sink.$bt_device_addr.a2dp_sink
fi
Nach viel Herumprobieren mit Umgebungsvariablen habe ich das pacmd
Zeug zum Laufen gebracht. Jetzt bluetoothctl
hängt das Teil jedoch mit “Waiting to connect to bluetoothd…”
. Das funktioniert einwandfrei, wenn ich es manuell von der Shell aus aufrufe, sudo /usr/local/bin/a2dp-fix-wrapper
aber nicht, wenn udev es startet. Ich stelle mir vor, dass es eine Art Umgebungsvariable sein muss, die verhindert, bluetoothctl
dass die laufende bluetoothd
Instanz gefunden wird.
Hat jemand eine Idee?
Antwort1
Nach langer Zeit habe ich mich dazu entschlossen, es noch einmal zu versuchen, und habe es mithilfe von dbus statt bluetoothctl endlich dazu gebracht, das gewünschte Ergebnis zu erzielen.
Ich habe ein paar Dinge ausprobiert, die nicht funktioniert haben. Stattdessen echo -e "connect $device_mac\nquit" | bluetoothctl
habe ich Folgendes ausprobiert:
coproc bluetoothctl
echo -e "select E4:B3:18:48:43:D2\nconnect $device_mac\nquit" >&${COPROC[1]}
output=$(cat <&${COPROC[0]})
echo $output
Ich habe auch versucht:
hcitool cc $device_mac
Ich habe auch ein paar Python-Skripte ausprobiert, aber letztendlich hat die Verwendung dbus-send
mein Problem gelöst.
Meine Skripte sind wie folgt:
/etc/udev/rules.d/80-bt-headset.rules
ACTION=="add", SUBSYSTEM=="bluetooth", RUN+="/usr/local/bin/a2dp-fix-wrapper"
/usr/local/bin/a2dp-fix-wrapper
#!/bin/bash
for PID in $(pgrep pulseaudio); do
USER=$(grep -z USER= /proc/$PID/environ | sed 's/.*=//' | tr -d '\0')
USER_ID=$(id -u $USER)
HOME=$(echo $(getent passwd $USER )| cut -d : -f 6)
export XDG_RUNTIME_DIR=/run/user/$USER_ID
export XAUTHORITY=$HOME/.Xauthority
export DISPLAY=:0
sleep 5
if [[ ! -z $USER ]]; then
sudo -u $USER -E /usr/local/bin/a2dp-fix
fi
done
/usr/local/bin/a2dp-fix
#!/bin/bash
bt_device_addr=$(pacmd list-cards | grep -i 'name:.*bluez_card' | sed -E 's/.*<?bluez_card\.([A-Z0-9_]+)>?/\1/')
device_mac=$(echo $bt_device_addr | sed 's/_/:/g')
a2dp_available=$(pacmd list-cards | grep -A30 bluez | grep "A2DP Sink" | sed -E 's/.* available: ([a-z]+)\)/\1/g')
if [[ "$a2dp_available" == "no" ]]
then
dbus-send --system --dest=org.bluez --print-reply /org/bluez/hci0/dev_$bt_device_addr org.bluez.Device1.Connect
pacmd set-card-profile bluez_card.$bt_device_addr off
pacmd set-card-profile bluez_card.$bt_device_addr a2dp_sink
pacmd set-default-sink bluez_sink.$bt_device_addr.a2dp_sink
fi
Jetzt verbindet sich mein Bluetooth-Headset immer über den A2DP-Sink :-D
Großer Dank andieser Beitragfür die Inspiration.