Понадобилось поменять у колонок правый и левый канал местами. Нагуглил несколько способов. Но на Debian 9 сработало это:
Находим файл: /usr/share/pulseaudio/alsa-mixer/profile-sets/default.conf
В нём находим секцию с нужной конфигурацией. В моём случае это было:
[Mapping analog-surround-21]
device-strings = surround21:%f
channel-map = front-left,front-right,lfe
paths-output = analog-output analog-output-lineout analog-output-speaker
priority = 8
direction = output
И в ней меняю каналы левый и правый местами. Получилось вот так:
[Mapping analog-surround-21]
device-strings = surround21:%f
channel-map = front-right,front-left,lfe
paths-output = analog-output analog-output-lineout analog-output-speaker
priority = 8
direction = output
Сохраняем. И потом от имени своего пользователя (Не рута! А из-под обычного) выполняем команду:
pactl exit
Всё. Можно проверять.
apt upgrade и сломанный звукНедавно я запустил привычное apt upgrade. Пакеты обновились, система перезагрузилась, и вроде бы всё отлично. Но сегодня я включил видео и обнаружил, что каналы снова поменялись местами. «Ничего страшного, — подумал я, — поправлю как обычно».
Я открыл тот самый конфигурационный файл, внёс изменения, сохранил и попытался перезапустить звук старым проверенным способом:
myuser@mycomp:~$ pactl exit
Произошла ошибка: Доступ запрещён
«Странно», — подумал я. Попробовал от рута:
root@mycomp:~# pactl info | grep "Server Name"
Ошибка подключения: Соединение отвергнуто
Произошла ошибка при выполнении pa_context_connect(): Соединение отвергнуто
Звук как-то работал, но управлять им через pactl я больше не мог. Пора было разбираться, что же изменилось в системе.
Первым делом я решил проверить, какие аудиодемоны вообще запущены в системе:
myuser@mycomp:~$ ps aux | grep -E "pulseaudio|pipewire"
myuser 1086 0.1 0.1 91024 26168 ? S
Всё встало на свои места. Процесса pulseaudio нет вовсе. Вместо него работает pipewire и pipewire-pulse. Как оказалось, Debian 12 (Bookworm) по умолчанию полностью перешёл на PipeWire в качестве звукового сервера. Мои старые правки в файлах PulseAudio больше ни на что не влияют — этот пакетный менеджер просто снёс старый конфиг или больше не использует его.
Но почему pactl выдает «Доступ запрещён»? Я проверил статус служб от имени своего пользователя:
myuser@mycomp:~$ systemctl --user status pipewire pipewire-pulse wireplumber
Все три сервиса были активны (active (running)). Тогда я запустил pactl info без grep и увидел ответ:
Имя сервера: PulseAudio (on PipeWire 0.3.65)
Оказалось, что pactl нормально подключается к серверу pipewire-pulse. А вот ошибка «Доступ запрещён» при попытке сделать pactl exit — это штатное поведение PipeWire. Команда EXIT в протоколе PulseAudio приказывает серверу выключиться. Разработчики PipeWire намеренно блокируют эту команду для клиентов, так как аудиосервер управляется через systemd, и гасить его вручную не нужно. Для перезапуска звука теперь нужно использовать systemctl --user restart wireplumber.
Также я обнаружил, что запуск pactl от root бессмысленен. В мире PipeWire звук работает в пользовательской сессии (per-user), и сокет находится по пути /run/user/1000/pulse/native. У root нет к нему доступа, да и собственного аудиосервера у него нет.
С причиной проблем разобрался. Оставалось найти рабочий способ поменять каналы в PipeWire. Лезть в системные файлы /usr/share/... больше не хотелось — при следующем обновлении их снова перезапишут.
В Debian 12 для управления PipeWire используется сессионный менеджер WirePlumber версии 0.4.x. Его конфигурация пишется на языке Lua и хранится в ~/.config/wireplumber/. Идеальный вариант — создать там пользовательский файл, который не затрется при апгрейдах.
Шаг 1. Узнаём имя нужного приёмника звука (sink)
Я выполнил команду:
myuser@mycomp:~$ pactl list short sinks
44 alsa_output.usb-C-Media_Electronics_Inc._USB_PnP_Sound_Device-00.iec958-stereo PipeWire s16le 2ch 48000Hz SUSPENDED
567 alsa_output.pci-0000_00_1b.0.analog-stereo.3 PipeWire s32le 2ch 48000Hz SUSPENDED
Мой встроенный звук — это alsa_output.pci-0000_00_1b.0.analog-stereo.3.
(Примечание: суффикс .3 — это известный баг WirePlumber 0.4.x, который иногда приписывает цифры к именам устройств. Исправлен только в версии 0.5.3, которой в Debian 12 пока нет. Чтобы не привязываться к этой цифре, я решил использовать маску поиска по имени).
Шаг 2. Создаём конфигурационный файл
Я создал директорию для конфигов и сам файл:
mkdir -p ~/.config/wireplumber/main.lua.d/
nano ~/.config/wireplumber/main.lua.d/51-swap-channels.lua
Внутрь файла я поместил следующий код. Он ищет устройство по префиксу имени (чтобы пережить смену суффикса .2 или .3) и меняет свойство audio.position, которое отвечает за маппинг физических каналов:
rule = {
matches = {
{
-- матчим по префиксу, чтобы пережить смену суффикса .2/.3/.4
{ "node.name", "matches", "alsa_output.pci-0000_00_1b.0.analog-stereo*" },
},
},
apply_properties = {
-- меняем порядок: было FL,FR -> стало FR,FL
["audio.position"] = "FR,FL",
},
}
table.insert(alsa_monitor.rules, rule)
Шаг 3. Применяем настройки
Чтобы WirePlumber перечитал конфиги, я перезапустил его:
myuser@mycomp:~$ systemctl --user restart wireplumber
Проверить, применились ли настройки, можно с помощью wpctl inspect <ID_узла> | grep -i position. В моем случае grep почему-то ничего не вывел, однако практический тест через графический интерфейс системы (настройки звука KDE) показал, что левый и правый каналы благополучно поменялись местами! Цель была достигнута.
Донаты принимаются на кошельки:
Yoomoney:
4100118091867315
Карта Т-Банк (бывший Тиньков):
2200 7017 2612 2077
Карта Альфа-Банк:
2200 1539 1357 2013