如何在耳机断开时自动静音?或者如何利用 bash 脚本来监听系统事件?

如何在耳机断开时自动静音?或者如何利用 bash 脚本来监听系统事件?

sound如果 Ubuntu每次我断开连接时都将静音,我的生活就会更轻松headphones,因为每次周围环境都不同(例如白天/夜晚),但输出音量相同。

我可能会弄清楚这个脚本,但必须与 交互Ubuntu event listener。到目前为止,我对此一无所知。

我将非常感激针对这两个问题的解决方案或提示,但不会package为如此简单的事情安装任何东西,这些东西太长了update+我希望我的系统尽可能干净或合理。


实际上,我会根据所了解的内容写出更多我所不知道的解决方案reaction to events,比如在连接时自动调整 USB 鼠标设置(他们为什么要重置?)或在连接时自动启用 GSM 调制解调器。

答案1

首先,alsamixer在终端中打开程序(Ctrl+Alt+T)。

在此处输入图片描述

检查自动静音是否已启用。您可以使用左右键导航到它,并使用上下键切换值。Esc 退出。

现在,如果您不使用耳机静音,然后插上耳机,再拔下耳机,扬声器的声音应该保持静音。至少在我的计算机上,启用自动静音后,我可以让扬声器保持静音,而耳机插入后可以输出声音。

答案2

简短回答

  1. 要查看通知,您必须安装notify-osdsudo apt install notify-osd
  2. <my_name>.sh在你的目录中创建一个文本文件/home/<user_name>/。并为文件添加执行权限chmod +x /home/<user_name>/<my_name>.sh
  3. 将以下文本粘贴到<my_name>.sh文件中

    #!/bin/bash
    acpi_listen | while IFS= read -r line;
    do
        if [ "$line" = "jack/headphone HEADPHONE plug" ]
        then
           amixer -D pulse set Master mute
           notify-send "headphones connected. Sound is muted"
        elif [ "$line" = "jack/headphone HEADPHONE unplug" ]
        then
           amixer -D pulse set Master mute
           notify-send "headphones disconnected.  Sound is muted"
        fi
    done
    
  4. 启动配置linux 系统(ubuntu、kubuntu、xubuntu 等)的菜单。将/home/<user_name>/<my_name>.sh文件设置为自动启动 您的桌面环境(xfce、KDE、Gnome 等)。

警告!如果你使用 KDE,那么不要添加文件"Start script before KDE""Application"使用bash /home/<user_name>/<my_name>.sh
使用作为脚本(场景)和“从 KDE 开始”
如果如果您已经这样做了,则按ctrl + alt + F2,以用户身份登录并删除rm /home/<user_name>/<my_name>.sh。如果您没有删除权限,则在删除之前重新安装磁盘mount -o remount, rw /

如何编辑脚本

一些基于 Linux 的系统缓存自动启动脚本。这意味着即使您编辑/home/<user_name>/<my_name>.shlogout / loginrestart系统,脚本也将保持不变。
在 KDE 中,您可以在中找到缓存的脚本符号链接/home/<user_name>/.config/autostart-scripts/<my_name>.sh<my_name>.sh手动删除文件,logout / login系统,将脚本添加到autostart并重复logout / login
在我看来,这KDE 错误。我不知道其他 DE(xfce、Gnome 等)

你需要知道什么

您可以看到如上"jack/headphone HEADPHONE plug"代码所示的文本。这是耳机事件名称。

要查看事件:
1.在控制台中输入acpi_listen
2.插头耳机(或其他设备)
3. 您将在安慰. 它将类似于下面的文本

    user@user-PC:~$ acpi_listen
    jack/headphone HEADPHONE unplug
    jack/microphone MICROPHONE unplug
    jack/headphone HEADPHONE plug
    jack/microphone MICROPHONE plug

如果上述脚本中的事件名称是不同的然后将其替换为来自安慰输出。

ACPI 和事件

要查看和测试 ACPI 事件,您可以使用事件测试 sudo apt install evtest

    user@user-PC:~$ sudo evtest
    No device specified, trying to scan all of /dev/input/event*
    Available devices:
    /dev/input/event0:      Lid Switch
    /dev/input/event1:      Power Button
    /dev/input/event2:      Power Button
    /dev/input/event3:      AT Translated Set 2 keyboard
    /dev/input/event4:      Video Bus
    /dev/input/event5:      SynPS/2 Synaptics TouchPad
    /dev/input/event6:      COMPANY USB Device
    /dev/input/event7:      COMPANY USB Device
    /dev/input/event8:      COMPANY USB Device
    /dev/input/event9:      HP Wireless hotkeys
    /dev/input/event10:     HDA Intel HDMI HDMI/DP,pcm=3
    /dev/input/event11:     HDA Intel HDMI HDMI/DP,pcm=7
    /dev/input/event12:     HDA Intel HDMI HDMI/DP,pcm=8
    /dev/input/event13:     HDA Intel HDMI HDMI/DP,pcm=9
    /dev/input/event14:     HDA Intel HDMI HDMI/DP,pcm=10
    /dev/input/event15:     HDA Intel PCH Mic
    /dev/input/event16:     HDA Intel PCH Headphone
    /dev/input/event17:     HP WMI hotkeys
    /dev/input/event18:     HP Webcam: HP Webcam
    Select the device event number [0-18]: 16
    Input driver version is 1.0.1
    Input device ID: bus 0x0 vendor 0x0 product 0x0 version 0x0
    Input device name: "HDA Intel PCH Headphone"
    Supported events:
    Event type 0 (EV_SYN)
    Event type 5 (EV_SW)
        Event code 2 (SW_HEADPHONE_INSERT) state 1
    Properties:
    Testing ... (interrupt to exit)
    Event: time 1522588668.319567, type 5 (EV_SW), code 2 (SW_HEADPHONE_INSERT), value 0
    Event: time 1522588668.319567, -------------- SYN_REPORT ------------                      
    Event: time 1522588670.035275, type 5 (EV_SW), code 2 (SW_HEADPHONE_INSERT), value 1       
    Event: time 1522588670.035275, -------------- SYN_REPORT ------------

由于某些原因,/etc/acpi/events/jack它对我来说不起作用。可能是我错了配置_SND_HDA_输入插孔选项。要测试该使用

    sudo grep CONFIG_SND_HDA_INPUT_JACK /boot/config-$(uname -r)

我的回答基于回答。

答案3

您可以通过设置耳机插入/拔出事件的 ACPI 监听器来自动执行此操作:

$ grep headphone /etc/acpi/handler.sh -A 11                                                                                                         
    jack/headphone)                                                                                                                                 
        case "$3" in
            plug)
                logger "Headphones plugged"
                amixer sset 'Headphone' 30%
                ;;
            unplug)
                logger "Headphones unplugged"
                amixer sset 'Speaker' 30%
                ;;
    esac
    ;;
$ systemctl restart acpid

其他方式:
/etc/acpi/handler.sh您可以创建另一个配置文件并指定自己的脚本来处理这些事件 ,而无需进行修改/etc/acpi/events/。使用默认配置作为模板:

$ cat /etc/acpi/events/anything                                                                                                                     
# Pass all events to our one handler script                                                                                                         
event=.*
action=/etc/acpi/handler.sh %e

查看man acpid更多详细信息。

相关内容