diff --git a/.gitignore b/.gitignore index a00fed8..63f1854 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ zola +zbuild.sh static/processed_images/ themes/yunohost/ public/ diff --git a/content/articles/autoconnect-bluetooth-phones/index.md b/content/articles/autoconnect-bluetooth-phones/index.md new file mode 100644 index 0000000..2f36025 --- /dev/null +++ b/content/articles/autoconnect-bluetooth-phones/index.md @@ -0,0 +1,123 @@ ++++ +title = "Автоматическое переключение звука на Bluetooth-наушники в Linux с помощью udev и wpctl" +date = 2025-09-07 +description = "Если вы используете Linux и часто подключаете Bluetooth-наушники, наверняка замечали, что звук не всегда автоматически переключается на новое устройство. В этом посте мы разберём простой и надёжный способ автоматизации этого процесса с помощью udev и wpctl (PipeWire)." + +[taxonomies] +tags = ["bluetooth", "udev", "wpctl", "pipewire"] + +[extra] +quick_navigation_buttons = true +toc = true +mermaid = false +social_media_card = "social_cards/index_autoconnect-bluetooth-phones.webp" ++++ + +## Вступление + +В Linux есть два популярных звуковых сервиса: PulseAudio и PipeWire. PipeWire постепенно становится стандартом, и в сочетании с WirePlumber можно настроить автоматическое переключение. Но иногда WirePlumber не срабатывает, или событие обрабатывается с задержкой. Решение — использовать udev, который отслеживает события подключения устройств и запускает скрипт. + +## Шаг 1: Проверяем PipeWire и wpctl + +Убедитесь, что PipeWire и WirePlumber запущены: + +```bash +systemctl --user status pipewire +systemctl --user status wireplumber +``` + +Также полезно посмотреть список аудиоустройств: + +```bash +wpctl status +``` + +Вы увидите свои колонки и Bluetooth-устройства: + +```arduino +Audio + ├─ Sinks: + │ * 136. alsa_output.usb-ARTURIA_ArturiaMsd-00.analog-stereo + │ 55. bluez_output.XX_XX_XX_XX_XX_XX.a2dp-sink + +``` + +## Шаг 2: Создаём скрипт для переключения звука + +Создаём скрипт `/usr/local/bin/bt-audio-autoswitch.sh`: + +```bash +#!/bin/bash +ACTION=$1 +STATEFILE="/run/user/$(id -u)/bt-audio-last-sink" +LOGTAG="bt-audio-autoswitch" + +# Текущее устройство вывода +get_default_sink() { + wpctl status | awk '/\*.*sink/ {print $2; exit}' | tr -d '[]' +} + +# Идентификатор первого Bluetooth sink +get_bt_sink() { + wpctl status | awk '/bluez_output/ {print $2; exit}' | tr -d '[]' +} + +# Ждём обновления PipeWire +sleep 2 + +if [ "$ACTION" = "add" ]; then + CURRENT=$(get_default_sink) + if [ -n "$CURRENT" ]; then + echo "$CURRENT" > "$STATEFILE" + logger "$LOGTAG: сохранил текущее устройство $CURRENT" + fi + BT_ID=$(get_bt_sink) + if [ -n "$BT_ID" ]; then + wpctl set-default "$BT_ID" + logger "$LOGTAG: переключил звук на $BT_ID" + fi +elif [ "$ACTION" = "remove" ]; then + if [ -f "$STATEFILE" ]; then + PREV=$(cat "$STATEFILE") + if [ -n "$PREV" ]; then + wpctl set-default "$PREV" + logger "$LOGTAG: вернул звук на $PREV" + fi + rm -f "$STATEFILE" + fi +fi +``` + +Делаем скрипт исполняемым: + +```bash +sudo chmod +x /usr/local/bin/bt-audio-autoswitch.sh +``` + +## Шаг 3: Создаём udev-правило + +```udev +# Подключение Bluetooth аудио +ACTION=="add", SUBSYSTEM=="sound", KERNEL=="card*", RUN+="/usr/local/bin/bt-audio-autoswitch.sh add" + +# Отключение Bluetooth аудио +ACTION=="remove", SUBSYSTEM=="sound", KERNEL=="card*", RUN+="/usr/local/bin/bt-audio-autoswitch.sh remove" +``` + +Применяем новые правила: + +```bash +sudo udevadm control --reload-rules +sudo udevadm trigger +``` + +## Шаг 4: Проверяем работу + +Подключаем Bluetooth-наушники. Скрипт автоматически сохранит текущее устройство и переключит звук на наушники. + +Отключаем наушники. Скрипт вернёт звук на сохранённое устройство (например, ваши колонки). + + +## Заключение + +Использование udev + wpctl позволяет надёжно автоматизировать переключение аудио на Bluetooth-наушники даже в случае, если WirePlumber не успевает сработать. Этот подход легко настраивается и не требует ручного выбора устройства при каждом подключении. diff --git a/content/articles/autoconnect-bluetooth-phones/social_cards/index_autoconnect-bluetooth-phones.webp b/content/articles/autoconnect-bluetooth-phones/social_cards/index_autoconnect-bluetooth-phones.webp new file mode 100644 index 0000000..1a638fb Binary files /dev/null and b/content/articles/autoconnect-bluetooth-phones/social_cards/index_autoconnect-bluetooth-phones.webp differ