Files
2025-11-22 18:34:52 +07:00

124 lines
4.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
+++
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-устройства:
```ini
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-правило
```ini
# Подключение 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 не успевает сработать. Этот подход легко настраивается и не требует ручного выбора устройства при каждом подключении.