Я пробовал, настраивает мой микрофон 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 не существует". Это все еще работает.
Мое заключительное главным образом рабочее решение.
правила 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 событию, но те, которых я попробовал, нарушают правило. В то время как то событие только должно быть выполнено однажды выполнение, оно дважды ничего не повредит, и я рад, что оно не выполняет больше, чем это. Так... на данный момент... Я сделан.
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"