如何自动静音耳机断开? 或者如何将bash脚本点击到系统事件监听器?

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

我可以为此找出脚本,但不能没有与Ubuntu event listener交互。 到目前为止我对此一无所知。

我会欣赏任何一个主题的解决方案或提示,但不是为了这么简单的事情而安装任何package ,其中一堆是update方式太长+我喜欢我的系统可能是干净或推理。


实际上我会写出更多我不知道的解决方案, reaction to eventsreaction to events的知识,比如在连接时自动调整USB鼠标设置(他们重置的地狱?)或者在连接时自动启用GSM调制解调器。

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

在此处输入图像描述

检查automute是否已启用。 您可以使用左右键导航到它,然后向上切换以切换值。 Esc退出。

现在,如果您在没有耳机的情况下静音,请插入耳机并再次拔下耳机,扬声器发出的声音应保持静音。 至少在我的机器上,启用自动静音后,我可以保持扬声器静音,而耳机可以在插入时输出声音。

简短的回答

  1. 要查看通知,您必须安装notify-osd sudo apt install notify-osd
  2. /home//目录中创建文本文件.sh 。 并将执行权限添加到文件chmod +x /home//.sh
  3. 将下面的文本粘贴到.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//.sh文件设置为使用桌面环境(xfce,KDE,Gnome等) 自动启动

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

如何编辑脚本

一些基于Linux的系统缓存自动启动脚本。 这意味着即使您编辑/home//.shlogout / loginrestart系统,脚本也将保持不变。
在KDE中,您可以在/home//.config/autostart-scripts/.sh找到缓存的脚本符号链接。 手动删除.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事件,您可以使用evtest 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对我不起作用。 可能我错了CONFIG_SND_HDA_INPUT_JACK选项。 测试那个用途

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

我的答案是基于这个答案。

您可以通过为耳机插头/拔出事件设置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/events/创建另一个配置文件,并指定自己的脚本来处理这些事件,而不是修改/etc/acpi/handler.sh 。 使用默认配置作为模板:

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

看看man acpid了解更多细节。