LINUX.ORG.RU

Правила для Wireplumber/Pipewire

 wireplumber pipewire


0

1

Доброго времени суток! Расскажите пожалуйста, кто знает, как создавать правила для Pipewire. Знаю, что там очень широкий спектры возможностей, мне нужно для всех api.alsa.pcm.source сделать мьют и задать определенный уровинь громкости по умолчанию. Пробовал разное, что-то вроде:

table.insert(alsa_monitor.rules, {
  matches = {
    {
      { "factory.name", "equals", "api.alsa.pcm.source" },
    },
  },
   actions = {
     update-props = {
       node.param.Props = { channelVolumes = [ 0.5 0.5 ] }
     }
   }
  },
})

В файле ~/.config/wireplumber/main.lua.d/80-main.lua Не работает. А вот:

  apply_properties = {
   ["priority.driver"] = 800,
  },

Работает. Не пойму как добраться до нужных мне параметров.

★★

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

Работает вот такая команда:

wpctl status
...
 ├─ Sources:
 │      46. Built-in Audio Analog Stereo        [vol: 0.79]
...

➜  pw-cli s 46 Props '{ mute: true, channelVolumes: [ 0.50, 0.50 ] }'

Устройство по факту мьютится и меняется громкость, но индикаторы почему-то это не отображают, видно только через wpctl status.

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

Да, надо не просто скриптом, а именно правилами. Что бы при различных переключениях значения сбрасывались не на рандомные и не на 100%, а на установленные мной.

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

А какие индикаторы? У меня, например, самописный(почти) bash-скрипт для waybar, и в нём всё отображается, потому как там в скрипте опрос идет раз в несколько секунд. Может проблема в индикаторах?

Скрипт вот такой

#!/bin/bash
snore() {
    local IFS
    [[ -n "${_snore_fd:-}" ]] || exec {_snore_fd}<> <(:)
    read -r ${1:+-t "$1"} -u $_snore_fd || :
}

DELAY=1.2

while snore $DELAY; do
    WP_OUTPUT=$(wpctl get-volume @DEFAULT_AUDIO_SINK@)

    if [[ $WP_OUTPUT =~ ^Volume:[[:blank:]]([0-9]+)\.([0-9]{2})([[:blank:]].MUTED.)?$ ]]; then
        if [[ -n ${BASH_REMATCH[3]} ]]; then
            printf "MUTE\n"
        else
            VOLUME=$((10#${BASH_REMATCH[1]}${BASH_REMATCH[2]}))

	  	    ICON=(
                ""
                ""
                ""
			    )

		    WP_DEFAULT=$(wpctl inspect @DEFAULT_AUDIO_SINK@)
			if [[ $WP_DEFAULT == *"Jabra EVOLVE 20 MS"* ]]; then
               ICON=(
                   ''
                   ''
                   ''
               )
			fi

			if [[ $VOLUME -eq 100 ]]; then
                printf "%s" "${ICON[0]}"
            elif [[ $VOLUME -gt 50 ]]; then
                printf "%s" "${ICON[0]} "
            elif [[ $VOLUME -gt 25 ]]; then
                printf "%s" "${ICON[1]} "
            elif [[ $VOLUME -ge 0 ]]; then
                printf "%s" "${ICON[2]} "
            fi

            printf "$VOLUME%%\n"
        fi
    fi
done

PS: А что на ЛОРе bash синтаксис не подсвечивается?

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

Я использую встроенный в waybar функционал.

    "pulseaudio#spk": {
      "format": "{icon} {volume}%",
      "format-bluetooth": " {icon} {volume}%",
      "format-bluetooth-muted": "  {volume}%",
      "format-muted": " {volume}%",
      "format-icons": {
        "headphone": "",
        "default": ["", "", ""]
      },
      "on-click": "pamixer -t",
      "on-click-right": "pavucontrol -t 3",
      "on-scroll-up": "pamixer -i 1",
      "on-scroll-down": "pamixer -d 1"
    },
    "pulseaudio#mic": {
      "format": "{format_source}",
      "format-source": " {volume}%",
      "format-source-muted": " {volume}%",
      "on-click": "pamixer --source @DEFAULT_SOURCE@ -t",
      "on-click-right": "pavucontrol -t 4",
      "on-scroll-up": "pamixer --source @DEFAULT_SOURCE@ -i 1",
      "on-scroll-down": "pamixer --source @DEFAULT_SOURCE@ -d 1"
    },

Тоже думал написать скрипт, но мне кажется это будет сильный костыль. По идее звуковая система должна решать эти моменты, нельзя же всю систему обвязывать скриптами.

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

Да, я столкнулся с этим в документации. Множество рецептов уже для 5й версии но в стабильном Debian wireplumber пока 0.4.13. Возможно с обновлением все решится.

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

Я не осилил разные значки для колонок\наушников. Возможно потому что эта возможность есть в модуле pulseaudio, но её нет в модуле wireplumber. Кстати, возможно, что не обновляется индикатор именно по этой причине.

Для wireplumber же свой модуль есть, но он анскильный

https://man.archlinux.org/man/waybar-wireplumber.5.en

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

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

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

Этим "factory.name", "equals", "api.alsa.pcm.source" я пытался создать универсальное решение, но оно не работает как я ожидал.

Вот вывод:

$ pw-dump  | jq '.[] | select(.type == "PipeWire:Interface:Device" and .info.props."device.api" == "alsa") | .info.props'
{
  "alsa.card": 0,
  "alsa.card_name": "HDA Intel PCH",
  "alsa.driver_name": "snd_hda_intel",
  "alsa.long_card_name": "HDA Intel PCH at 0x61241b0000 irq 201",
  "api.acp.auto-port": false,
  "api.acp.auto-profile": false,
  "api.alsa.card": 0,
  "api.alsa.card.longname": "HDA Intel PCH at 0x61241b0000 irq 201",
  "api.alsa.card.name": "HDA Intel PCH",
  "api.alsa.path": "hw:0",
  "api.alsa.use-acp": true,
  "api.dbus.ReserveDevice1": "Audio0",
  "client.id": 34,
  "device.api": "alsa",
  "device.bus": "pci",
  "device.bus-path": "pci-0000:00:1f.3",
  "device.description": "Built-in Audio",
  "device.enum.api": "udev",
  "device.form-factor": "internal",
  "device.icon-name": "audio-card-analog-pci",
  "device.name": "alsa_card.pci-0000_00_1f.3",
  "device.nick": "HDA Intel PCH",
  "device.plugged.usec": 23081088,
  "device.product.id": "0x51ca",
  "device.product.name": "Raptor Lake-P/U/H cAVS",
  "device.string": 0,
  "device.subsystem": "sound",
  "device.sysfs.path": "/devices/pci0000:00/0000:00:1f.3/sound/card0",
  "device.vendor.id": "0x8086",
  "device.vendor.name": "Intel Corporation",
  "factory.id": 14,
  "media.class": "Audio/Device",
  "object.id": 40,
  "object.path": "alsa:pcm:0",
  "object.serial": 40
}
nuxster ★★
() автор топика
Ответ на: комментарий от nuxster

Я не на 100% уверен, что это прям то устройство, что будет обрабатываться фильром, но у него нет свойства factory.name.

Может попробовать фильтр по другому полю?

{ "object.path", "equals", "alsa:pcm:0" }
Belkrr
()
Ответ на: комментарий от Belkrr

Если сделать pw-dump | less и ручками найти это устрочтво, то такйо параметр есть.

 "props": {
        "alsa.card": 0,
        "alsa.card_name": "HDA Intel PCH",
        "alsa.class": "generic",
        "alsa.device": 0,
        "alsa.driver_name": "snd_hda_intel",
        "alsa.id": "ALC256 Analog",
        "alsa.long_card_name": "HDA Intel PCH at 0x61241b0000 irq 201",
        "alsa.name": "ALC256 Analog",
        "alsa.resolution_bits": 16,
        "alsa.subclass": "generic-mix",
        "alsa.subdevice": 0,
        "alsa.subdevice_name": "subdevice #0",
        "api.alsa.card.longname": "HDA Intel PCH at 0x61241b0000 irq 201",
        "api.alsa.card.name": "HDA Intel PCH",
        "api.alsa.path": "front:0",
        "api.alsa.pcm.card": 0,
        "api.alsa.pcm.stream": "capture",
        "audio.adapt.follower": "",
        "audio.channels": 2,
        "audio.position": "FL,FR",
        "card.profile.device": 0,
        "client.id": 34,
        "clock.quantum-limit": 8192,
        "device.api": "alsa",
        "device.class": "sound",
        "device.id": 40,
        "device.profile.description": "Analog Stereo",
        "device.profile.name": "analog-stereo",
        "device.routes": 1,
        "factory.id": 18,
        "factory.mode": "split",
        "factory.name": "api.alsa.pcm.source",
        "library.name": "audioconvert/libspa-audioconvert",
        "media.class": "Audio/Source",
        "node.description": "Built-in Audio Analog Stereo",
        "node.driver": true,
        "node.name": "alsa_input.pci-0000_00_1f.3.analog-stereo.4",
        "node.nick": "ALC256 Analog",
        "node.pause-on-idle": false,
        "object.id": 64,
        "object.path": "alsa:pcm:0:front:0:capture",
        "object.serial": 274,
        "priority.driver": 2009,
        "priority.session": 2009
      },
nuxster ★★
() автор топика