Я не верю, что это дубликат Ubuntu, изменяющего аудиовыход по умолчанию после приостановки, потому что я не приостанавливаю ПК.
У меня есть 3 аудиовыхода (аналоговые наушники, USB цифровой усилитель, USB-гарнитура) и 2 аудиовхода (гарнитура, микрофон веб-камеры) на моем настольном ПК.
Когда я разблокирую ПК, он переключает аудиовыход по умолчанию на USB-гарнитуру, хотя я бы предпочел использовать аналоговые наушники.
Как ни странно, однако, музыка (через Клементину) продолжает выходить из моих наушников; Просто регуляторы громкости на моей клавиатуре изменяют громкость на USB-гарнитуре.
Я подозреваю (но не знаю), что это может быть связано с тем, что USB-гарнитура подключена через концентратор на моем мониторе, который выключается, когда ПК заблокирован, и, по-видимому, приводит к событию USB-соединения при повторном включении.
Как это исправить?
(Ubuntu 18.04)
tl; dr? Прокрутите до конца.
Адаптировано из здесь , это отслеживает блокировку / разблокировку экрана:
#!/bin/bash
watch="type=signal,interface=org.gnome.ScreenSaver"
screen_locked_signal="boolean true"
screen_unlocked_signal="boolean false"
dbus-monitor --session "$watch" | ( \
while read signal; do
if [[ "$signal" =~ "$screen_locked_signal" ]]; then
echo "Screen Locked"
elif [[ "$signal" =~ "$screen_unlocked_signal" ]]; then
echo "Screen Unlocked"
fi
done)
Вы можете узнать, какой источник и приемник в настоящее время используются в качестве следующее:
$ pactl info | grep -E 'Default (Source|Sink):'
Default Sink: alsa_output.usb-Logitech_Inc._Logitech_USB_Headset_H340-00.analog-stereo
Default Source: alsa_input.usb-Logitech_Inc._Logitech_USB_Headset_H340-00.analog-stereo
(Это моя USB-гарнитура)
Вы можете переключать источник и приемник следующим образом:
$ pactl set-default-sink alsa_output.pci-0000_00_1b.0.analog-stereo
$ pactl set-default-source alsa_input.pci-0000_00_1b.0.analog-stereo
(Использовать аналоговый выход и вход)
Вы можете получить полный список источников и приемников с помощью pactl список коротких источников
и pactl list short sources
, но там есть дополнительные записи. Вероятно, лучше всего переключиться с помощью инструментов пользовательского интерфейса, а затем использовать pactl info
, чтобы найти подходящие.
Результатом является сценарий, который выглядит следующим образом:
#!/bin/bash
# GNOME
watch="type=signal,interface=org.gnome.ScreenSaver"
screen_locked_signal="boolean true"
screen_unlocked_signal="boolean false"
# PulseAudio: use pactl
_get_default_sink() {
pactl info | sed -n 's/^Default Sink: \(.*\)/\1/p'
}
_get_default_source() {
pactl info | sed -n 's/^Default Source: \(.*\)/\1/p'
}
_set_default_sink() {
pactl set-default-sink "$1"
}
_set_default_source() {
pactl set-default-source "$1"
}
last_sink=$(_get_default_sink)
last_source=$(_get_default_source)
echo "sink is $last_sink; source is $last_source"
# Watch for screensaver D-Bus signals
dbus-monitor --session "$watch" | ( \
while read signal; do
if [[ "$signal" =~ "$screen_locked_signal" ]]; then
# Screen locked: remember the current default sink and source
last_sink=$(_get_default_sink)
last_source=$(_get_default_source)
echo "Screen Locked; sink was $last_sink; source was $last_source"
elif [[ "$signal" =~ "$screen_unlocked_signal" ]]; then
# Screen unlocked: restore the last default sink and source
_set_default_sink "$last_sink"
_set_default_source "$last_source"
echo "Screen Unlocked; sink is $(_get_default_sink); source is $(_get_default_source)"
fi
done)
Чтобы гарантировать, что этот сценарий запускается сразу после входа в систему, вы можете использовать gnome-session -properties
и добавить запускаемое приложение (я назвал свое «Заставка монитора»), указывающее на скрипт. Будет создан файл ~ / .config / autostart / monitor-screensaver.desktop
, содержащий следующее:
[Desktop Entry]
Type=Application
Exec=/home/roger/bin/monitor-screensaver
Hidden=false
NoDisplay=false
X-GNOME-Autostart-enabled=true
Name[en_GB]=Monitor Screensaver
Name=Monitor Screensaver
Comment[en_GB]=
Comment=
Другой способ справиться с этим - через конфигурацию PulseAudio.
Вы можете запустить
pactl unload-module module-switch-on-connect
до блокировки и
pactl load-module module-switch-on-connect
после разблокировки. ( pacmd
можно использовать вместо pactl
.)
В качестве альтернативы вы можете отключить (прочитать: закомментировать) загрузку модуля в конфигурации default.pa
файл; см. man 5 default.pa
. Затем вам нужно вручную переключить устройство по умолчанию.