LINUX.ORG.RU

Как обменять «левые» и «правые» аудиовыходы местами на Linux? Решение через pipewire тоже годится

 ,


0

0

По просьбам трудящихся это тред создан для обсуждения вопросов зеркальной перестановки вывода левой и правой "сторон" в физические устройства.

Дано: неизвестная аудокарта с неизвестным числом аудоканалов выводящя завук на неизвестное число физических "спикеров" и, опционально сабвуфер.

Задача - настроить конфигурацию аудиосистемы так, чтобы любой вывод на "левую" и "правую" строну зеркально менялся местами.

@James_Holden официально приглашается в этот тред со своим решением.



Последнее исправление: dataman (всего исправлений: 2)

Если запустить в режиме jack, то просто перетыкаешь лево-право.

Shadow ★★★★★
()

То есть, число физических выходных каналов неизместно, но надо переставить левый и правый? А если один канал выходной? А если бы да кабы?

Сформулируй задачу корректно, попробуй еще раз. Что конкретно куда тебе надо переставить.

В том треде, если ты читал внимательно, в чем я уже сомневаюсь, написно СТЕРЕО колонки. Именно СТЕРЕО колонки. Перечитай еще раз.

James_Holden ★★★★★
()

Какие к лешему стороны? А центральный канал, это какая сторона у тебя, левая или правая? Сабвуфер это какая сторона? Что за ерунда.

Конкретно давай, какая конфигурация колонок стоит, какие конкретно из них подключены наоборот. Для этого делается конкретный конфиг, который меняет местами.

James_Holden ★★★★★
()

В альсе через ttable можно как угодно ремапить и даже микшировать каналы.

no-such-file ★★★★★
()

Как это сделать на уровне системы, не знаю, никогда не интересовался. Но копать в эту сторону соблазнительно, да.

Варианты на постоянку, если у тебя каналы перепутаны. Купить нормальную звуковую карту или спаять переходник. Если у тебя акустика с нестандартной распиновкой, спаять переходник.

Вариант для динамического переключения. Если у тебя многоканальная акустика и надо, допустим, левую, правую, заднюю пару или тройку делать передней, я бы копал в сторону установки или самостоятельного написания плагина для плеера.

Vidrele ★★★★★
()
Ответ на: комментарий от Vidrele

Зачем тебе плагин для плеера, это делается конфигом звукового сервера pipewire элементарно, для любых программ выводящих звук, прозрачно. И динамически, кликом по иконке микшера твоего DE и выбором варианта, либо скриптом повешеным на хоткей.

James_Holden ★★★★★
()
Последнее исправление: James_Holden (всего исправлений: 1)
Ответ на: комментарий от James_Holden

А для любых программ отдельно? Представь, что у нашего героя пекарня подключена к телевизору у длинной стены, но музыку он слушает в кресле у короткой.

Vidrele ★★★★★
()
Ответ на: комментарий от Vidrele

Конечно. Для любых отдельно. Для этого и придумали pipewire.

Создаешь несколько виртуальных sink с разными конфигурациями. В любом плеере, есть настройка «устройство вывода». В каждой программе выбираешь вывод именно в тот виртуальный sink, который нужен. Все.

James_Holden ★★★★★
()
Последнее исправление: James_Holden (всего исправлений: 1)
Ответ на: комментарий от James_Holden

Какие к лешему стороны?

Левая и правая. Если ты не знаешь, что это - привяжи к одной ноге пучок сена, а к другой - пучок соломы и скинь нам фотку. Мы тебе расскажем, где у тебя какая сторона.

А центральный канал, это какая сторона у тебя, левая или правая?

Центральный канал называется центральным потому что он идёт по центру и не является ни левым, ни правым. С ними ничего делать не надо.

Сабвуфер это какая сторона?

Сабвуфер - это все стороны сразу, с ним тоже ничего делать не надо.

Надо только обменять выход всех "левых" сторон на "правые" и наоборот. В спецификациях на стерео, 4 канала, 5.1, 6.1 и 7.1 звук написано, какие из каналов левые, а какие - правые. Про центральный и сабвуфер - тоже.

Конкретно давай, какая конфигурация колонок стоит,

У аудиокарты опубликованы программно 5.1 или 7.1 канал. А физический вывод может быть вообще в наушники.

Для этого делается конкретный конфиг, который меняет местами.

Хорошо. Продемонстрируй конкретный конфиг, который для встроенных аудиокарт поменяет местами левые и правые стороны вывода.

написно СТЕРЕО колонки. Именно СТЕРЕО колонки.

Колонки-то может быть и стерео, и даже моно. А вот источник звука и программный интерфейс аудокарты - многоканальные. На всякий случай поясню для тех, кто плохо ориентируется между «лево» и «право» : «много» - это больше двух.

r--r--r--
() автор топика
Ответ на: комментарий от r--r--r--

В этом и вопрос что речь про конфигурацию софта. В оборудовании у вас что меняется?

cobold ★★★★★
()
Ответ на: комментарий от r--r--r--

Вот базовый вариант для стерео-стерео, он демонстрирует принцип, применимый к любой конфигурации.

context.modules = [
    { name = libpipewire-module-filter-chain
        args = {
            node.description = "Exchange"
            media.name       = "Exchange"
            filter.graph = {
                nodes = [
                    {
                      type = builtin
                      label = mixer
                      name = mixL
                      control = {
                      }
                    }
                    {
                      type = builtin
                      label = mixer
                      name = mixR
                      control = {
                      }
                    }
                ]
                links = [

                ]
                inputs = [ "mixL:In 1" "mixR:In 1" ]
                outputs = [ "mixR:Out" "mixL:Out" ]
            }
            capture.props = {
                node.name   = "effect_input.exchange"
                media.class = Audio/Sink
                audio.channels = 2
                audio.position=[FL FR]
            }
            playback.props = {
                node.name   = "effect_output.exchange"
                node.passive = true
                audio.channels = 2
                audio.position=[FL FR]
            }
        }
    }
]

Смысл. На каждый входной канал создаем ноду Mixer в filter-chain. Затем, в разделе inputs/outputs, подключаем эти ноды к выходным каналам в измененном порядке. В этом примере, правый и левый поменяны местами.

Если надо не стерео, а 5.1 - все то же самое, создаем 6 нод в цепочке filter-chain, а в inputs/outputs пересоединяем их в любом измененном порядке.

Со стороны источников звука - они увидят виртуальный синк exchange в списке устройств вывода. Этот синк будет иметь столько же входных программных каналов, и такие же каналы, как и твоя аудиокарта. Но он представляет собой фильтр, пройдя через который нужные каналы меняются местами. Без изменения числа и конфигурации каналов. Для приложения, выводящего звук, не изменится ничего, а физически, звук пойдет в другие каналы.

Если число каналов у плеера и у этого синка не совпадают, pipewire автоматически либо сделает downmix, либо раскидает по части каналов. Все как с реальной звуковой картой.

Этот конфиг надо назвать exchange.conf и поместить в ~/.config/pipewire/pipewire.conf.d

James_Holden ★★★★★
()
Последнее исправление: James_Holden (всего исправлений: 4)

Вот пример для 5.1 конфигурации (не тестировал)

context.modules = [
    { name = libpipewire-module-filter-chain
        args = {
            node.description = "Exchange"
            media.name       = "Exchange"
            filter.graph = {
                nodes = [
                    {
                      type = builtin
                      label = mixer
                      name = mixFL
                      control = {
                      }
                    }
                    {
                      type = builtin
                      label = mixer
                      name = mixFR
                      control = {
                      }
                    }
		    {
                      type = builtin
                      label = mixer
                      name = mixFC
                      control = {
                      }
                    }
		    {
                      type = builtin
                      label = mixer
                      name = mixRL
                      control = {
                      }
                    }
		    {
                      type = builtin
                      label = mixer
                      name = mixRR
                      control = {
                      }
                    }
		    {
                      type = builtin
                      label = mixer
                      name = mixLFE
                      control = {
                      }
                    }
                ]
                links = [

                ]
                inputs = [ "mixFL:In 1" "mixFR:In 1" "mixFC:In 1" "mixRL:In 1" "mixRR:In 1" "mixLFE:In 1"]
                outputs = [ "mixFR:Out" "mixFL:Out" "mixFC:Out" "mixRR:Out" "mixRL:Out" "mixLFE:Out"]
            }
            capture.props = {
                node.name   = "effect_input.exchange"
                media.class = Audio/Sink
                audio.channels = 6
                audio.position=[FL FR FC RL RR LFE]
            }
            playback.props = {
                node.name   = "effect_output.exchange"
                node.passive = true
                audio.channels = 6
                audio.position=[FL FR FC RL RR LFE]
            }
        }
    }
]
James_Holden ★★★★★
()
Ответ на: комментарий от ya-betmen

Больше контактов - меньше надежность. А главное зачем? Вроде с программной точки зрения тривиальная задача - поменять местами соседние слова в буфере

cobold ★★★★★
()
  • Markdown
Пустая строка (два раза Enter) начинает новый абзац. Знак '>' в начале абзаца выделяет абзац курсивом цитирования.
Внимание: прочитайте описание разметки Markdown.
Используйте Ctrl-Enter для размещения комментария