LINUX.ORG.RU

Как заставить pipewire игнорировать конкретный hdmi выход?

 , ,


0

1

У меня два монитора, один основной, второй вспомогательный. В основной воткнуты колонки. Также ещё есть блютус колонка и беспроводные наушники (usb). Колонка подключается эпизодически, остальное всё воткнуто постоянно.

Я использую скриптики xrandr для переключения вывода изображения на разные мониторы, соответственно при этих переключениях меняется состав звуковых устройств. Поэтому ранее я настроил себе в pipewire приоритет звуковух hdmi -> блютус колонка -> наушники.

Ранее вспомогательный монитор был подключен по dvi, и соответственно не присутствовал среди звуковых устройств, и мой приоритет работал идеально. Но в этом мониторе что-то померло, и теперь dvi вход работает некорректно, пришлось подключить его по hdmi. И это всё сломало, так как hdmi-звуковуха считается одним устройством с несколькими портами, и соответственно наивысший приоритет hdmi стал распространяться и на конфигурацию когда включен только вспомогательный монитор. У устройств есть профили, но они походу генерятся автоматически, так как в ситуации когда включен один любой монитор - задействуется профиль hdmi-0, и только когда включены оба - можно выбрать один из двух.

Как научить pipewire распознавать мониторы по какому-нить признаку и полностью игнорировать вспомогательный?


Ответ на: комментарий от IIIypuk

Я тоже гуглил и в том числе и ответы от ИИ читал =)

Это вырубит вывод звука через hdmi полностью, а мне это не нужно. Мне нужно вырубить вывод звука через конкретный монитор, и всё это в условиях когда конфигурация активных мониторов динамически меняется.

А hdmi-выходы не являются отдельными аудиоустройствами. Это одно устройство HDA Intel PCH с разными портами. Но при этом в условиях когда активен только один монитор (любой) - для него автоматом используется один и тот же профиль, node.name становится одним и тем же, и устройство получает наивысший приоритет. И если в случае с основным монитором так и должно быть, то с вспомогательным так быть не должно, на него звук не должен выводиться никогда.

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

Как вариант можно спросить конкретно в pipewire на free desktop открыв iusse, или в групе матрицы

Вопрос такой при подключении двух мониторов в одну карту у тебя можно после этого на одном выключить звук а на другом включить, или они оба в одном интерфейсе?

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

Твоя конфигурация тоже влияет. В автоматическом режиме идет работа по определению устройств и наивысший приоритет отдать не получится - будут временами, хоть и редко проскакивать пропусти и прочие «ошибки», которые они разруливают. Задание приоритета вручную на вывод звука возможен, вот только когда это типа пульса там будет мусор сверху как описывается, а в режиме Pro Audio это режим Jack и там идет направление аудио потока напрямую куда-то и вывод есть устройство, а не нечто с выводами, что позволяет сильно снизить задержки звука, чего обывателям смотрящим кино ненужно даже - им как раз подходит ленивый режим с большим буфером. Для начала ненужно заявлять что все выглядит вот так, а не иначе, потому что это относится к режиму работы, который можно и вероятно нужно изменить. Я себе задал приоритет на вывод звука, чтобы пайпа перестала тупить и постоянно на ходу определять что там происходит, но это видимо будет лишним расписывать когда надо для начала потыкаться с джеком и вероятно скриптиками, а то мешанина полная.

anonymous
()
Ответ на: комментарий от SPRATAY

При активных обоих мониторах второму назначается другой профиль, hdmi-stereo-extra1, и начинает работать эта моя конструкция в wireplumber.conf.d:

  {
    matches = [
      {
        node.name = "alsa_output.pci-0000_00_1f.3.hdmi-stereo"
      }
    ]
    actions = {
      update-props = {
        priority.driver = 1500
        priority.session = 1500
      }
    }
  },
  {
    matches = [
      {
        node.name = "alsa_output.pci-0000_00_1f.3.hdmi-stereo-extra1"
      }
    ]
    actions = {
      update-props = {
        priority.driver = 500
        priority.session = 500
      }
    }
  },

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

Если сделать pactl list cards при активных обоих мониторах, то будет такой вывод (часть опущена для краткости):

Профили:
    off: Выключено (аудиоприёмников: 0, источников: 0, приоритет: 0, доступен: да)
    output:hdmi-stereo: Цифровой стерео (HDMI) выход (аудиоприёмников: 1, источников: 0, приоритет: 5900, доступен: да)
    output:hdmi-stereo-extra1: Digital Stereo (HDMI 2) выход (аудиоприёмников: 1, источников: 0, приоритет: 5700, доступен: да)
    output:hdmi-stereo-extra2: Digital Stereo (HDMI 3) выход (аудиоприёмников: 1, источников: 0, приоритет: 5700, доступен: нет)
    ... далее ещё куча неактивных профилей (с "доступен: нет")
    pro-audio: Pro Audio (аудиоприёмников: 12, источников: 0, приоритет: 1, доступен: да)
Активный профиль: output:hdmi-stereo
Порты:
    hdmi-output-0: HDMI / DisplayPort (priority: 5900, latency offset: 0 usec, available)
        Свойства:
            port.type = "hdmi"
            port.availability-group = "Legacy 1"
            device.icon_name = "video-display"
            card.profile.port = "0"
            device.product.name = "HP LD5512"
            Входит в профиль(и): output:hdmi-stereo
    hdmi-output-1: HDMI / DisplayPort 2 (priority: 5800, latency offset: 0 usec, available)
        Свойства:
            port.type = "hdmi"
            port.availability-group = "Legacy 2"
            device.icon_name = "video-display"
            card.profile.port = "1"
            device.product.name = "ASUS VS229"
            Входит в профиль(и): output:hdmi-stereo-extra1
    hdmi-output-2: HDMI / DisplayPort 3 (priority: 5700, latency offset: 0 usec, available)
        Свойства:
            port.type = "hdmi"
            port.availability-group = "Legacy 3"
            device.icon_name = "video-display"
            card.profile.port = "2"
            Входит в профиль(и): output:hdmi-stereo-extra2, output:hdmi-surround-extra2, output:hdmi-surround71-extra2
    ... далее ещё куча портов, такие же как hdmi-output-2, только с другими цифрами

Видно, что у первых двух портов есть поле device.product.name в которых прописаны имена мониторов, HP LD5512 основной, ASUS VS229 вспомогательный. Однако если сделать также, когда активен только вспомогательный монитор, то ASUS VS229 «переедет» в hdmi-output-0, ему достанется профиль hdmi-stereo вместо hdmi-stereo-extra1, и он получит наивысший приоритет. А мне нужно чтобы на него в принципе никогда не выводился звук, колонки то к нему не подключены никакие.

Порты:
    hdmi-output-0: HDMI / DisplayPort (priority: 5900, latency offset: 0 usec, available)
        Свойства:
            port.type = "hdmi"
            port.availability-group = "Legacy 1"
            device.icon_name = "video-display"
            card.profile.port = "0"
            device.product.name = "ASUS VS229"
            Входит в профиль(и): output:hdmi-stereo

Может можно на каком-нить более низком уровне его отрубить? Например через alsa? Ещё вылез неприятный побочный эффект - теперь при включении компа случайным образом громкость звука может стать 100% вместо штатных 45%. А после переключения мониторов с вспомогательного на основной становится на 100% всегда до момента пока не изменишь её.

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

Ты вот пристаешь к человеку, который вероятно не особо копался в этом со всей упертостью зачем-то. Мало того что ты зачем-то через HDMI звук гоняешь, хотя эта опция по сути для шлакового вывода звука, либо технически передать звук на ресивер какой-нибудь. Нам не пофиг что там у тебя, если ты сам копаться отказываешься? Замутить карту в альсе для тебя не вариант по-видимому, назначить устройство в приоритет у альсы тоже не выходит, отключить не получается. Ты задолбал тут пытаться задумать. Wireplumber иначе работает. Приоритеты то он задает, но по сути твои что 500, что 1500 это овер дохрена при использовании стандартного буфера скажем в 20 миллисекунд. Это для другого вообще и нужно по сути в режиме Pro Audio, чтобы снизить задержку для обработки и вывода звука в реальном времени, а не тупежа с настройками. Проблема в том что ты решил что звук по HDMI это нечто хорошее - это вот главная проблема, а остальное это сопутствующий бред. Я ничего хуже чем звук из монитора по HDMI не слышал даже от древних встроек. Это мрак мрачный, потому что выходной каскад там беднющий по сути. Кому оно сдалось делать монитор на 10к дороже за здорово живешь? Ставлю на то что этот бедолага забанил анонимов и теперь пыжится и не может ничего понять.

anonymous
()
Ответ на: комментарий от STinger

Самое забавное это то что в системе даже делать ничего ненужно. Выставишь звук на устройство, например USB звуковую - она будет работать. Отключишь - звук перейдет на предыдущий вывод звука с теми настройками какие стоят. Снова воткнешь - снова включится USB звуковая. Это надо быть весьма глупым, чтобы не заметить простейший принцип работы. По крайней мере в плазме так и происходит. Может другой рабочий стол все извращает, но это элементарно заметить. Но для этого надо мозги включить, чтобы понять что происходит. Не просто всасывать информацию по-тупому, а думать своей головой - своими мозгами. Куча выхлопа просто в никуда получается без намека на понимание, это даже если вручную все не задавать. Что там в скриптах боюсь представить с таким уровнем интеллекта. Сколько там? 80 IQ то наберется?

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

Ты вот пристаешь к человеку

Я не пристаю, а отвечаю на вопрос, заодно накидывая побольше технических деталей.

Проблема в том что ты решил что звук по HDMI это нечто хорошее - это вот главная проблема, а остальное это сопутствующий бред. Я ничего хуже чем звук из монитора по HDMI не слышал даже от древних встроек.

Во-первых, звук из колонок монитора не равно звук из колонок, подключенных к монитору. У меня неплохие на мой взгляд колонки, которые я воткнул в аналоговый аудиовыход монитора. Главная причина такого решения - мне нужно выводить звук и изображение с двух компов, не занимаясь при этом ручной перекоммутацией каждый раз. Я щёлкнул кнопкой на пульте - вывелись изображение и звук со второго компа.

Во-вторых, я не аудиофил, и качество звука из большинства встроенных ЦАП меня устраивает. Звук по hdmi передаётся в цифровом виде, в аналоговый его преобразовывает ЦАП в мониторе. И этот звук, выведенный на мои отдельные колонки для меня нормальный. Возможно есть мониторы с особо убогими ЦАП, от которых даже у меня уши вянуть будут, но мне пока что повезло. И конечно же я не собираюсь покупать ресивер за 100к+.

И в третьих, комп на котором я всё это настроить пытаюсь - intel nuc, у которого в принципе никакой альтернативы звуку через hdmi не предусмотрено. Можно usb-звуковух конечно натыкать, но зачем?

Самое забавное это то что в системе даже делать ничего ненужно. Выставишь звук на устройство, например USB звуковую - она будет работать. Отключишь - звук перейдет на предыдущий вывод звука с теми настройками какие стоят. Снова воткнешь - снова включится USB звуковая. Это надо быть весьма глупым, чтобы не заметить простейший принцип работы.

Я заметил этот простой принцип работы «что воткнул, то и заиграло», и он меня не устраивает. Поэтому я ручками настроил себе приоритет hdmi -> блютус колонка -> usb наушники. И оно идеально работало до тех пор, пока hdmi устройство было одно.

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