Итак, у меня есть эта проблема на моем разъеме на передней панели, из-за которого звук переворачивается, так было всегда, но мне всегда удавалось поменять местами каналы либо в Windows, либо в Ubuntu (через pulseaudio), просто найдя файл конфигурации и сопоставив свои позиции таким образом, что работал.
Недавно я установил Pipewire для облегчения потоковой передачи звука с разногласиями и т.п., но я не могу найти четкого представления о том, как с его помощью отображать каналы.
Если бы кто-нибудь мог показать мне, где находится правильный файл конфигурации и какая строка управляет позициями аудиоканала, я был бы рад и очень благодарен.
редактировать: я на Ubuntu 21.10, pipewire на версии 3.34
Моя конфигурация pipewire по адресу etc/pipewire/pipewire.conf
# Файл конфигурации демона для версии PipeWire "0.3.32" #
#
# Скопируйте и отредактируйте этот файл в /etc/pipewire для общесистемных изменений
# или в ~/.config/pipewire для локальных изменений.
контекст. свойства = {
## Настройте свойства в системе.
#library.name.system = поддержка/libspa-поддержка
#context.data-loop.library.name.system = поддержка/libspa-поддержка
#support.dbus = истина
#link.max-buffers = 64
link.max-buffers = 16 # версии < 3 клиенты не могут больше обрабатывать
#mem.warn-mlock = ложь
#mem.allow-mlock = истина
#mem.mlock-all = ложь
#clock.power-of-two-quantum = true
#лог.уровень = 2
audio.position = "FR,FL"
core.daemon = true # прослушивание сокетных соединений
core.name = pipewire-0 # имя ядра и имя сокета
## Свойства конфигурации DSP.
#default.clock.rate = 48000
#default.clock.quantum = 1024
#default.clock.min-квант = 32
#default.clock.max-квант = 8192
#default.video.width = 640
#default.video.height = 480
#default.video.rate.num = 25
#default.video.rate.denom = 1
#
# Эти переопределения применяются только при работе в виртуальной машине.
vm.overrides = {
default.clock.min-квант = 1024
}
}
context.spa-libs = {
#<регулярное выражение имя-фабрики> = <имя-библиотеки>
#
# Используется для поиска названий спа-фабрик. Он отображает название спа-фабрики
# регулярное выражение к имени библиотеки, которое должно содержать
# этот завод.
#
audio.convert.* = аудиоконвертировать/libspa-аудиоконвертировать
api.alsa.* = alsa/libspa-alsa
api.v4l2.* = v4l2/libspa-v4l2
api.libcamera.* = libcamera/libspa-libcamera
api.bluez5.* = bluez5/libspa-bluez5
api.vulkan.* = вулкан/libspa-вулкан
api.jack.* = jack/libspa-jack
поддержка.* = поддержка/libspa-поддержка
#videotestsrc = видеотесты/libspa-videotestsrc
#audiotestsrc = audiotestsrc/libspa-audiotestsrc
}
контекст.модули = [
#{ имя = <имя-модуля>
# [ аргументы = { <ключ> = <значение> ... } ]
# [ флаги = [ [ ifexists ] [ nofail ] ]
#}
#
# Загружает модуль с заданными параметрами.
# Если указано ifexists, модуль игнорируется, если он не найден.
# Если указано nofail, ошибки инициализации модуля игнорируются.
#
# Использует RTKit для повышения приоритета потока данных.
{имя = libpipewire-module-rtkit
аргументы = {
#хороший.уровень = -11
#rt.prio = 88
#rt.time.soft = 2000000
#rt.time.hard = 2000000
}
флаги = [ если существует без ошибок ]
}
# Установить приоритеты потоков без использования RTKit.
#{ имя = libpipewire-module-rt
# аргументы = {
# хороший.уровень = -11
# рт.прио = 88
# rt.time.soft = 2000000
# rt.time.hard = 2000000
# }
# flags = [ ifexists nofail ]
#}
# Собственный протокол связи.
{имя = libpipewire-module-protocol-native}
# Модуль профиля. Разрешить приложению доступ к профайлеру
# и данные о производительности. Он предоставляет интерфейс, который используется
# с помощью pw-top и pw-profiler.
{имя = libpipewire-module-profiler}
# Позволяет приложениям создавать объекты метаданных. Это создает
# фабрика для объектов метаданных.
{имя = libpipewire-module-metadata}
# Создает фабрику по производству устройств, работающих в
# контекст сервера PipeWire.
{ name = libpipewire-module-spa-device-factory }
# Создает фабрику для создания узлов, работающих в
# контекст сервера PipeWire.
{имя = libpipewire-module-spa-node-factory}
# Позволяет создавать узлы, работающие в контексте
# клиент. Используется всеми клиентами, которые хотят предоставить
# данные в PipeWire.
{ имя = libpipewire-модуль-клиент-узел }
# Позволяет создавать устройства, работающие в контексте
# клиент. Используется диспетчером сеансов.
{ имя = libpipewire-модуль-клиент-устройство }
# Модуль портала отслеживает PID процесса портала
# и помечает соединения с тем же PID, что и у портала
# соединения.
{имя = libpipewire-module-portal
флаги = [ если существует без ошибок ]
}
# Модуль доступа может выполнять проверки доступа и блокировать
# новых клиентов.
{имя = libpipewire-модуль-доступ
аргументы = {
# access.allowed для отображения массива путей разрешенных
# Программы.
#доступ.разрешено = [
# /usr/bin/pipewire-media-session
#]
# Массив отвергнутых путей.
#доступ.отклонено = [ ]
# Массив путей с ограниченным доступом.
#access.restricted = [ ]
# Всему, что не входит в приведенные выше списки, присваивается
# access.force разрешение.
#access.force = плоский пакет
}
}
# Делает фабрику для упаковки узлов в адаптер с
# конвертер и ресемплер.
{ имя = libpipewire-модуль-адаптер }
# Делает фабрику для создания ссылок между портами.
{имя = libpipewire-module-link-factory}
# Предоставляет фабрики для создания объектов диспетчера сеансов.
{имя = libpipewire-module-session-manager}
]
контекст.объекты = [
#{фабрика = <имя-фабрики>
# [ аргументы = { <ключ> = <значение> ... } ]
# [ флаги = [ [ nofail ] ]
#}
#
# Создает объект из фабрики PipeWire с заданными параметрами.
# Если указано nofail, ошибки игнорируются (и объект не создается).
#
#{ factory = spa-node-factory args = { factory.name = videotestsrc node.name = videotestsrc Spa:Pod:Object:Param:Props:patternType = 1 } }
#{ factory = spa-device-factory args = { factory.name = api.jack.device foo=bar } flags = [ nofail ] }
#{ factory = spa-device-factory args = { factory.name = api.alsa.enum.udev } }
#{ factory = spa-node-factory args = { factory.name = api.alsa.seq.bridge node.name = Internal-MIDI-Bridge } }
#{ factory = adapter args = { factory.name = audiotestsrc node.name = my-test } }
#{ factory = spa-node-factory args = { factory.name = api.vulkan.compute.source node.name = my-compute-source } }
# Драйвер-пустышка по умолчанию. Это обрабатывает узлы, отмеченные «node.always-driver».
# свойство, когда никакой другой драйвер в данный момент не активен. Клиенты JACK нуждаются в этом.
{ фабрика = спа-узел-фабрика
аргументы = {
factory.name = support.node.driver
node.name = фиктивный драйвер
node.group = pipewire.dummy
приоритет.драйвер = 20000
}
}
{ фабрика = спа-узел-фабрика
аргументы = {
factory.name = support.node.driver
node.name = Драйвер свободного хода
приоритет.драйвер = 19000
node.group = pipewire.freewheel
узел.свободное колесо = истина
}
}
Это создает новый исходный узел. Он будет иметь входные порты
которые вы можете связать, чтобы предоставить звук для этого источника.
{фабрика = адаптер
аргументы = {
factory.name = support.null-аудио-приемник
node.name = "мой-микрофон"
node.description = "Микрофон"
media.class = "Аудио/Источник/Виртуальный"
audio.position = "FR,FL"
}
}
Это создает одно исходное устройство PCM для данного
путь устройства alsa hw:0. Вы можете изменить источник на приемник
сделать раковину таким же образом.
{фабрика = адаптер
аргументы = {
factory.name = api.alsa.pcm.source
node.name = "алса-источник"
node.description = "Источник PCM"
media.class = "Аудио/Источник"
api.alsa.path = "hw:0"
api.alsa.period-size = 1024
api.alsa.headroom = 0
api.alsa.disable-mmap = ложь
api.alsa.disable-batch = ложь
аудио.формат = "S16LE"
аудио.рейт = 48000
аудио.каналы = 2
audio.position = "FR,FL"
}
}
]
контекст.exec = [
#{ путь = <имя-программы> [аргументы = "<аргументы>" ] }
#
# Выполнить заданную программу с аргументами.
#
# Вы можете дополнительно запустить менеджер сеансов здесь,
# но лучше запускать его как сервис systemd.
# Запустите диспетчер сеансов с параметрами -h.
#
#{ path = "/usr/bin/pipewire-media-session" args = "" }
#
# Вы также можете запустить пульсаудио-сервер здесь
# но лучше запускать его как сервис systemd.
# Может быть интересно запустить здесь другого демона, который слушает
# по другому адресу с опцией -a (например, -a tcp:4713).
#
#{ path = "/usr/bin/pipewire" args = "-c pipewire-pulse.conf" }
]
карта каналов = вправо, влево