解锁后音频输出错误

Rog*_*mbe 1 sound

我不相信这与Ubuntu 在 suspend 之后更改默认音频输出的重复,因为我没有暂停 PC。

我的台式电脑上有 3 个音频输出(模拟耳机、USB 数字放大器、USB 耳机)和 2 个音频输入(耳机、网络摄像头麦克风)。

当我解锁电脑时,它已将默认音频输出切换到 USB 耳机,尽管我更喜欢使用模拟耳机。

然而奇怪的是,音乐(来自 Clementine)继续从我的耳机中传出;只是键盘上的音量控制改变了 USB 耳机的音量。

怀疑(但不知道)这可能是因为 USB 耳机是通过我的显示器上的集线器连接的,当 PC 锁定时,集线器会关闭,并且可能会在重新开机时导致 USB 连接事件。

我怎样才能解决这个问题?

(乌班图18.04)

Rog*_*mbe 5

太长了;博士?滚动到最后。

监控屏幕锁定/解锁

改编自这里,它监视屏幕锁定/解锁:

#!/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)
Run Code Online (Sandbox Code Playgroud)

脉冲音频

您可以按如下所示找出当前正在使用哪个源和接收器:

$ 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
Run Code Online (Sandbox Code Playgroud)

(这是我的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
Run Code Online (Sandbox Code Playgroud)

(使用模拟输出和输入)

pactl list short sinks您可以使用和获取源和接收器的完整列表pactl list short sources,但其中还有额外的条目。最好切换使用 UI 工具,然后使用它pactl info来发现合适的工具。


最终剧本

它会生成如下所示的脚本:

#!/bin/bash

# GNOME
watch="type=signal,interface=org.gnome.ScreenSaver"

# XFCE
# watch="type='signal',interface='org.xfce.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)
Run Code Online (Sandbox Code Playgroud)

自动启动脚本

为了确保该脚本在您登录后立即运行,您可以使用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=
Run Code Online (Sandbox Code Playgroud)