проблема, создающая udev, управляет для запущения скрипта что обратные петли микрометр на разъеме

Я пробовал, настраивает мой микрофон usb для переключения на значение по умолчанию и обратную петлю автоматически с 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"

micplug сценарий:

#!/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

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

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

Я думал, что это имело некоторое отношение к полномочиям, который является, почему я добавил GROUP. Я попробовал пару групп и владельцев и попробовал РЕЖИМ == "0660", но в этой точке я озадачен.

Отредактируйте 03.03.2017 Поэтому теперь, мой/usr/bin/pulse_events_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
    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

Это работает, но я не вывел бы все это в файл. Я попытался удалить echos и направить все к пустому указателю, но затем он прекращает работать.

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

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

Другая странная вещь даже при том, что это говорит, "Источник alsa_input.usb-Logitech_Logitech_USB_Microphone-00.analog-mono не существует". Это все еще работает.

0
задан 24 November 2017 в 06:24

2 ответа

Мое заключительное главным образом рабочее решение.

правила 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"

/usr/bin/pulse_events_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
    nohup sudo -u "#$PUID" -E $HOME/.pulse_events $1 >/dev/null 2>&1 &
  fi

fi

home/.pulse_events

#!/bin/bash
n=0
case $1 in
    micplug)
      while ! $(pactl list sources|grep -q 'Logitech USB Microphone Analog Mono')
        do let "n += 1"
        sleep 1
        if [ "$n" -eq 10 ]
          then break
        fi
      done
      pacmd set-default-source alsa_input.usb-Logitech_Logitech_USB_Microphone-00.analog-mono
      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)
      pactl unload-module $(pactl list short modules | awk '$2 == "module-loopback" { print $1 }' - )
      pacmd set-default-source alsa_input.usb-046d_081b_4B042590-02.analog-mono
    ;;
esac

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

0
ответ дан 3 November 2019 в 16:47

pulseaudio сервер обычно работает как Ваш обычный пользователь (по крайней мере, на 16,10, что я ввожу это от), однако udev запускает Ваш скрипт как корень без нормальных переменных среды, которые имеет Ваш обычный пользователь. Вы могли, вероятно, выполнить 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:

#!/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
ответ дан 3 November 2019 в 16:47

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

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