Я пытаюсь настроить свой 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 не существует». Он все еще работает. Сервер 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"