Alsa Pulseaudio. Как поменять левый и правый канал местами

Рейтинг:   / 3
ПлохоОтлично 

Понадобилось поменять у колонок правый и левый канал местами. Нагуглил несколько способов. Но на 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

 Всё. Можно проверять.

Дополнение от 16.08.2026:

Заветное apt upgrade и сломанный звук

Недавно я запустил привычное apt upgrade. Пакеты обновились, система перезагрузилась, и вроде бы всё отлично. Но сегодня я включил видео и обнаружил, что каналы снова поменялись местами. «Ничего страшного, — подумал я, — поправлю как обычно».

Я открыл тот самый конфигурационный файл, внёс изменения, сохранил и попытался перезапустить звук старым проверенным способом:

myuser@mycomp:~$ pactl exit
Произошла ошибка: Доступ запрещён

«Странно», — подумал я. Попробовал от рута:

root@mycomp:~# pactl info | grep "Server Name"
Ошибка подключения: Соединение отвергнуто
Произошла ошибка при выполнении pa_context_connect(): Соединение отвергнуто

Звук как-то работал, но управлять им через pactl я больше не мог. Пора было разбираться, что же изменилось в системе.

Диагностика: PulseAudio ушёл, пришёл PipeWire

Первым делом я решил проверить, какие аудиодемоны вообще запущены в системе:

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 нет к нему доступа, да и собственного аудиосервера у него нет.

Решение: меняем каналы местами в WirePlumber

С причиной проблем разобрался. Оставалось найти рабочий способ поменять каналы в 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