проблема с созданием правил udev для запуска скрипта, который замыкает микрофон на вилке

Я пытаюсь настроить свой USB-микрофон для автоматического переключения по умолчанию и loopback с помощью udev.

Мои текущие правила:

ACTION=="add", ATTR{idVendor}=="046d", ATTR{idProduct}=="0a03", GROUP=="audio" RUN+="/usr/bin/micplug"
ACTION=="remove", ENV{ID_MODEL}=="Logitech_USB_Microphone", RUN+="/usr/bin/micunplug"

Скрипт с микропроцессором: [ ! d2]

#!/bin/bash

echo "setting source mic" >> /home/wanderingconfused/test
pacmd set-default-source alsa_input.usb-Logitech_Logitech_USB_Microphone-00.analog-mono
echo "loopback mic" >> /home/wanderingconfused/test
pactl load-module module-loopback latency_msec=1 source=alsa_input.usb-Logitech_Logitech_USB_Microphone-00.analog-mono sink=alsa_output.pci-0000_00_14.2.analog-stereo

Что устанавливает микрофон в качестве источника по умолчанию и замыкает его.

Сценарий micunplug:

#!/bin/bash

echo "turn off loopback" >> /home/wanderingconfused/test
pactl unload-module $(pactl list short modules | awk '$2 == "module-loopback" { print $1 }' - )
echo "setting source webcam" >> /home/wanderingconfused/test
pacmd set-default-source alsa_input.usb-046d_081b_4B042590-02.analog-mono

Отключает loopback и возвращает источник по умолчанию для моей веб-камеры.

Скрипты работают точно так же, как предполагалось. Тем не менее, когда udev выполняет их, все мое перекликается с тестовым файлом, но pulseaudio игнорирует команды.

Я думал, что это имеет какое-то отношение к разрешениям, поэтому я добавил GROUP. Я попробовал пару групп и владельцев и попробовал MODE == «0660», но на данный момент я в тупике.

Редактировать 3/3/2017 Итак, теперь мой / usr / bin / pulse_events_wrapper: [ ! d8]

#!/bin/bash

# Get UID of user running pulseaudio (uses the first if more than one)
PUID=`ps -C pulseaudio -o ruid= | awk '{print $1}'`

if [ ! -z "$PUID" ]; then
  # environment variables to export
  export PULSE_RUNTIME_PATH="/var/run/user/$PUID/pulse"
  export HOME=`getent passwd $PUID | cut -d: -f6`

  if [ -x "$HOME/.pulse_events" ]; then
    # Pass single command line arg to user script
    nohup sudo -u "#$PUID" -E $HOME/.pulse_events $1 >/dev/null 2>&1 &
  fi
fi

, а сценарий home / .pulse_events -

!/bin/bash

case $1 in
    micplug)
      echo "setting source mic" >> /home/wanderingconfused/test
      pacmd set-default-source alsa_input.usb-Logitech_Logitech_USB_Microphone-00.analog-mono >>/home/wanderingconfused/test 2>&1
      echo "loopback mic" >> /home/wanderingconfused/test
      pactl load-module module-loopback latency_msec=1 source=alsa_input.usb-Logitech_Logitech_USB_Microphone-00.analog-mono sink=alsa_output.pci-0000_00_14.2.analog-stereo$
    ;;

    micunplug)
      echo "turn off loopback" >> /home/wanderingconfused/test
      pactl unload-module $(pactl list short modules | awk '$2 == "module-loopback" { print $1 }' - ) >>/home/wanderingconfused/test 2>&1
      echo "setting source webcam" >> /home/wanderingconfused/test
      pacmd set-default-source alsa_input.usb-046d_081b_4B042590-02.analog-mono >>/home/wanderingconfused/test 2>&1
    ;;
esac

Он работает, но я бы не захотел сбрасывать все это в файл. Я попытался удалить эхо и проложить все до нуля, но потом он перестает работать.

Также, микрофон отключен, кажется, повторяется, когда я смотрю на тестовый файл:

setting source mic
loopback mic
68
turn off loopback
setting source webcam
turn off loopback
turn off loopback
You have to specify a module index or name
setting source webcam
You have to specify a module index or name
setting source webcam
Source alsa_input.usb-Logitech_Logitech_USB_Microphone-00.analog-mono does not exist.
70
Failure: No such entity
setting source mic
Source alsa_input.usb-Logitech_Logitech_USB_Microphone-00.analog-mono does not exist.
loopback mic
78
turn off loopback
turn off loopback
setting source webcam
You have to specify a module index or name
setting source webcam
setting source mic
Source alsa_input.usb-Logitech_Logitech_USB_Microphone-00.analog-mono does not exist.
loopback mic
80
turn off loopback
turn off loopback
setting source webcam
Failure: No such entity
setting source webcam
setting source mic
loopback mic
82
turn off loopback
turn off loopback
setting source webcam
You have to specify a module index or name
setting source webcam
setting source mic
Source alsa_input.usb-Logitech_Logitech_USB_Microphone-00.analog-mono does not exist.
loopback mic
84
turn off loopback
turn off loopback
setting source webcam
You have to specify a module index or name
setting source webcam
setting source mic
loopback mic
87
turn off loopback
setting source webcam
turn off loopback
You have to specify a module index or name
setting source webcam
[d12 ] Еще одна странная вещь, хотя она говорит: «Источник alsa_input.usb-Logitech_Logitech_USB_Microphone-00.analog-mono не существует». Он все еще работает.

1
задан 24 November 2017 в 17:24

1 ответ

Сервер pulseaudio обычно работает как ваш обычный пользователь (по крайней мере, на 16.10, из которого я набираю это), однако udev запускает ваш скрипт как root, без обычных переменных среды, которые имеет ваш обычный пользователь. Вероятно, вы можете запустить систему pulseaudio в целом (я этого никогда не делал, но https://community.linuxmint.com/tutorial/view/1137 подразумевает, что это можно сделать), или вам нужно будет изменить свой скрипт для запуска pacmd как этот пользователь.

Возможно, замените свой скрипт на оболочку для запуска каждого сценария пользователя, например:

/ usr / bin / pulse_event_wrapper:

#!/bin/bash

# Get UID of user running pulseaudio (uses the first if more than one)
PUID=`ps -C pulseaudio -o ruid= | awk '{print $1}'`

if [ ! -z "$PUID" ]; then
  # environment variables to export
  export PULSE_RUNTIME_PATH="/var/run/user/$PUID/pulse"
  export HOME=`getent passwd $PUID | cut -d: -f6`

  if [ -x "$HOME/.pulse_events" ]; then
    # Pass single command line arg to user script
    sudo -u "#$PUID" -E "$HOME/.pulse_events $1" >/dev/null 2>&1
  fi
fi

, тогда разместите свой скрипт в .pulse_events в своем домашнем каталоге (обязательно сделайте его исполняемым, например chmod 755 /home/wanderingconfused/.pulse_events)

/home/wanderingconfused/.pulse_events: [!d5 ]

#!/bin/bash

case $1 in
    micplug)
      echo "setting source mic" >> /home/wanderingconfused/test
      pacmd set-default-source alsa_input.usb Logitech_Logitech_USB_Microphone-00.analog-mono
      echo "loopback mic" >> /home/wanderingconfused/test
      pactl load-module module-loopback latency_msec=1 source=alsa_input.usb-Logitech_Logitech_USB_Microphone-00.analog-mono sink=alsa_output.pci-0000_00_14.2.analog-stereo
    ;;

    micunplug)
      echo "turn off loopback" >> /home/wanderingconfused/test
      pactl unload-module $(pactl list short modules | awk '$2 == "module-loopback" { print $1 }' - )
      echo "setting source webcam" >> /home/wanderingconfused/test
      pacmd set-default-source alsa_input.usb-046d_081b_4B042590-02.analog-mono
    ;;
esac

, наконец, udev вызовет оболочку с аргументом события, который вам нужен:

ACTION=="add", ATTR{idVendor}=="046d", ATTR{idProduct}=="0a03", GROUP=="audio" RUN+="/usr/bin/pulse_event_wrapper micplug"
ACTION=="remove", ENV{ID_MODEL}=="Logitech_USB_Microphone", RUN+="/usr/bin/pulse_event_wrapper micunplug"
1
ответ дан 23 May 2018 в 01:01
  • 1
    Мне пришлось изменить «sudo -u» # $ PUID " -E "$ HOME / .pulse_events $ 1 " & gt; / dev / null 2 ​​& amp; " к "sudo -u" # $ PUID " -E $ HOME / .pulse_events $ 1 & gt; / dev / null 2 ​​& amp; 1 " чтобы запустить его. Предполагаю, что это пространство было частью имени файла. – wanderingconfused 2 March 2017 в 20:01
  • 2
    Однако он все еще не выполняет команды pulseaudio. Я перенаправил stderr и stdout этих команд в тестовый файл, и он говорит мне, что «Source alsa_input.usb-Logitech_Logitech_USB_Microphone-00.analog-mono не является xist. & Quot; Я предполагаю, что он не добавляет устройство, пока все не закончится. Поэтому я попробовал переместить его в backgroud с помощью «sudo -u» # $ PUID " -E $ HOME / .pulse_events $ 1 & gt; / dev / null 2 ​​& amp; 1 " и он по-прежнему дает ту же ошибку. – wanderingconfused 2 March 2017 в 20:06

Другие вопросы по тегам:

Похожие вопросы: