私は次のudevルールを持っています:
ACTION=="add", SUBSYSTEM=="bluetooth", RUN+="/usr/local/bin/a2dp-fix-wrapper"
これにより、次のスクリプトが実行されます。
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
a2dp-fixは次のとおりです。
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
Env変数を何度もいじった後、pacmd
のものを機能させることができました。ただし、bluetoothctl
の部分は“Waiting to connect to bluetoothd…”
でハングします。これは、シェルからSudo /usr/local/bin/a2dp-fix-wrapper
を使用して手動で呼び出す場合は問題なく機能しますが、udevが開始する場合は機能しません。 bluetoothctl
が実行中のbluetoothd
インスタンスを見つけられないようにするのはある種の環境変数であるに違いないと思います。
誰か考えがありますか?
久しぶりに、これをもう一度試してみることにし、ついにbluetoothctlの代わりにdbusを使ってやりたいことができるようになりました。
うまくいかなかったいくつかのことを試しました。 echo -e "connect $device_mac\nquit" | bluetoothctl
の代わりに私は試しました:
coproc bluetoothctl
echo -e "select E4:B3:18:48:43:D2\nconnect $device_mac\nquit" >&${COPROC[1]}
output=$(cat <&${COPROC[0]})
echo $output
私も試しました:
hcitool cc $device_mac
また、いくつかのpythonスクリプトを試しましたが、最終的にはdbus-send
を使用して問題を解決しました。
私のスクリプトは次のとおりです。
/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-修正
#!/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
これで、Bluetoothヘッドセットは常にa2dpシンクを使用して接続します:-D
インスピレーションを与えてくれた この投稿 に感謝します。