在Linux中检测耳机连接/断开连接


30

连接耳机或从系统断开连接时,我正在尝试检测信号。做这个的最好方式是什么?

如果有带有驱动程序的特殊板,那将是我的首选方法。


我不确定我是否了解最后一部分-您打算通过在计算机上连接其他硬件来做到这一点吗?
rozcietrzewiacz 2011年

@rozcietrzewiacz-我有一个Java应用程序,需要在插入或拔出耳机时得到通知。那是我的目标。无论是否使用其他硬件,我都欢迎提出任何建议/建议。
user775633 2011年

@Gilles-不,典型的硬件确实会向软件提供通知。我知道这是U&L,但您可能熟悉经典的Windows烦人的通知:“您已将设备插入音频插孔!” i51.tinypic.com/2w2hogw.jpg。幸运的是,Linux并没有这样做,但是应该可以从您拥有的硬件中获得信息。问题是操作系统如何使这些信息可用。
凯文·维米尔

@KevinVermeer我对Windows的这种烦恼不是很熟悉,不。很高兴知道现代硬件确实会提供通知,谢谢。Linux通常会在/sys那时提供信息,也许还会通过dbus 提供通知。
吉尔(Gilles)“所以,别再邪恶了”

这不是在Windows系统上。此问题是针对LINUX操作系统的。我应该更加明确。抱歉! 无论如何,默认情况下看起来似乎没有简单的方法来捕获该通知。这就是为什么我什至想知道是否有任何定制卡具有驱动程序来捕获该信号并使该信号可用于在Linux上运行的应用程序。
user775633 2011年

Answers:


17

在我的Linux(Debian GNU / Linux 3.12.0 x86_64)中,acpi系统知道这一点,因此调用acpi_listen显示:

jack/microphone MICROPHONE plug
jack/headphone HEADPHONE plug
jack/microphone MICROPHONE unplug
jack/headphone HEADPHONE unplug

这似乎取决于内核配置中的选定选项 CONFIG_SND_HDA_INPUT_JACK

如果是这种情况,则可以填充 /etc/acpi/events/脚本以触发所需的任何内容。

检查acpid手册页http://linux.die.net/man/8/acpid


据Alsa报道,这在具有HDA Intel PCH,ALC892 Analog的Ubuntu 15.10系统上完美运行。设置CONFIG_SND_HDA_INPUT_JACK = y。
凯文夫,2016年

14

此信息在其中可用,/proc/asound/card0/codec#0并取决于硬件。对于我的计算机,它位于捕获此信息的部分中:

耳机已连接:

[...]
Node 0x0d [Pin Complex] wcaps 0x400181: Stereo
  Control: name="Speaker Phantom Jack", index=0, device=0
  Pincap 0x00000014: OUT Detect
  Pin Default 0x90170110: [Fixed] Speaker at Int N/A
    Conn = Analog, Color = Unknown
    DefAssociation = 0x1, Sequence = 0x0
    Misc = NO_PRESENCE
  Pin-ctls: 0x00:
[...]

耳机已断开连接(请参阅Pin-ctls):

[...]
Node 0x0d [Pin Complex] wcaps 0x400181: Stereo
  Control: name="Speaker Phantom Jack", index=0, device=0
  Pincap 0x00000014: OUT Detect
  Pin Default 0x90170110: [Fixed] Speaker at Int N/A
    Conn = Analog, Color = Unknown
    DefAssociation = 0x1, Sequence = 0x0
    Misc = NO_PRESENCE
  Pin-ctls: 0x40: OUT
[...]

您可以使用inotify来检查文件是否被修改并grep信息。

另请参阅https://askubuntu.com/questions/133809/mute-sound-on-headphone-unplug


1
man inotify说像/ proc这样的伪fs不能用inotify监视。有解决方法吗?
Bibek_G

@Bibek_G是的,使用acpi_listen(请参阅有神论者的答案)。
唐·哈奇

即使我只有一个带有单个声卡的简单笔记本,也不得不使用它audio1来代替audio0它。所以/proc/asound/card1/codec#0对我来说,可能对您来说是另一个号码。
hoijui

3

在系统上找到插孔的udev标记器,连接一个客户端(dbus-monitor),该客户端使用DBus监视总线,以获取有关插孔连接和断开连接的消息。


2

如果您的内核已配置插孔输入 root@brix:~# grep CONFIG_SND_HDA_INPUT_JACK /boot/config-$(uname -r)

使用Evtest您可以列出所有输入事件。

root@brix:/etc/acpi# evtest
No device specified, trying to scan all of /dev/input/event*
Available devices:
/dev/input/event0:  Power Button
/dev/input/event1:  Power Button
/dev/input/event2:  Logitech Logitech BT Mini-Receiver
/dev/input/event3:  CM Storm QuickFire Rapid keyboard
/dev/input/event4:  CM Storm QuickFire Rapid keyboard
/dev/input/event5:  PixArt Microsoft USB Optical Mouse
/dev/input/event6:  Logitech Logitech BT Mini-Receiver
/dev/input/event7:  Video Bus
/dev/input/event8:  HDA Intel HDMI HDMI/DP,pcm=3
/dev/input/event9:  HDA Intel HDMI HDMI/DP,pcm=7
/dev/input/event10: HDA Intel HDMI HDMI/DP,pcm=8
/dev/input/event11: HDA Intel PCH Front Mic
/dev/input/event12: HDA Intel PCH Rear Mic
/dev/input/event13: HDA Intel PCH Line
/dev/input/event14: HDA Intel PCH Line Out
/dev/input/event15: HDA Intel PCH Front Headphone
Select the device event number [0-15]: 14
Input driver version is 1.0.1
Input device ID: bus 0x0 vendor 0x0 product 0x0 version 0x0
Input device name: "HDA Intel PCH Line Out"
Supported events:
  Event type 0 (EV_SYN)
  Event type 5 (EV_SW)
    Event code 6 (SW_LINEOUT_INSERT)
Properties:
Testing ... (interrupt to exit)
Event: time 1465927534.591787, type 5 (EV_SW), code 6 (SW_LINEOUT_INSERT), value 0
Event: time 1465927534.591787, -------------- EV_SYN ------------
Event: time 1465927536.618428, type 5 (EV_SW), code 6 (SW_LINEOUT_INSERT), value 1
Event: time 1465927536.618428, -------------- EV_SYN ------------

2

称为hda-verb的工具可以使用引脚启用/禁用耳机插孔。

例如,

要启用耳机插孔,请使用:

./hda-verb /dev/snd/hwC0D0 0x0f SET_PIN_WIDGET_CONTROL 0x40

要禁用耳机插孔,请使用:

./hda-verb /dev/snd/hwC0D0 0x0f SET_PIN_WIDGET_CONTROL 0

由于您只想检查其状态,因此也许可以在Java程序中使用某种轮询机制,该机制可以使用hda检查上述引脚的状态。为此,您的Java程序应该能够调用hda-verb。另外,您可以检查hda-verb的来源(如果可用),并查看他们的操作方式。


0

我的笔记本电脑具有Conexant Intel HDA音频系统,但是麦克风和耳机插孔的音量控制从未出现在许多可用的混音器中,甚至包括alsamixer。麦克风和耳机扬声器只能打开或关闭。这是一个很小的脚本,可以做到这一点:

#!/bin/bash
#
# Switching on or off your headphone speaker and mic jacks
# and at the same time switching off or on your laptop front speakers.
# requires hda-verb-0.3-6-mdv2011.0.x86_64
#
# Before putting it in place make sure to test your PIN_WIDGET_CONTROL's
# with su -c 'python2 hda-analyzer.py' available here :
# http://www.alsa-project.org/hda-analyzer.py
#
PIN_CONFIGS=/sys/class/sound/hwC0D0/init_pin_configs
if [ ! -f $PIN_CONFIGS ]; then
    echo "Your kernel is missing CONFIG_SND_HDA_HWDEP=y"
    exit 0
fi
if [ ! -f /usr/sbin/hda-verb ]; then
    echo "This script requires hda-verb-0.3-6-mdv2011.0.x86_64"
    exit 0
fi
PINS_PRESENT=`cat $PIN_CONFIGS | awk '{print $1}'`
if [ `basename $0` = "speakers-off.sh" ]; then
# Headset (Mic (Node 0x1b) + Headphone Drive (Node 0x19)) : ON
# Laptop Speaker (Node 0x1f) : OFF
[ `echo "$PINS_PRESENT" | grep 0x19` ] &&
   /usr/sbin/hda-verb /dev/snd/hwC0D0 0x19 SET_PIN_WIDGET_CONTROL 0x40
[ `echo "$PINS_PRESENT" | grep 0x1f` ] &&
   /usr/sbin/hda-verb /dev/snd/hwC0D0 0x1f SET_PIN_WIDGET_CONTROL 0
[ `echo "$PINS_PRESENT" | grep 0x1b` ] &&
   /usr/sbin/hda-verb /dev/snd/hwC0D0 0x1b SET_PIN_WIDGET_CONTROL 0x64
fi

if [ `basename $0` = "speakers-on.sh" ]; then
# Headset (Mic (Node 0x1b) + Headphone Drive (Node 0x19)) : OFF
# Laptop Speaker (Node 0x1f) : ON
[ `echo "$PINS_PRESENT" | grep 0x19` ] &&
   /usr/sbin/hda-verb /dev/snd/hwC0D0 0x19 SET_PIN_WIDGET_CONTROL 0
[ `echo "$PINS_PRESENT" | grep 0x1f` ] &&
   /usr/sbin/hda-verb /dev/snd/hwC0D0 0x1f SET_PIN_WIDGET_CONTROL 0x40
[ `echo "$PINS_PRESENT" | grep 0x1b` ] &&
   /usr/sbin/hda-verb /dev/snd/hwC0D0 0x1b SET_PIN_WIDGET_CONTROL 0x24
fi

exit 0
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.