Linux 中检测耳机连接/断开

Linux 中检测耳机连接/断开

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

如果有专门的板子和驱动程序,那将是我的首选方式。

答案1

在我的 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

答案2

此信息在硬件中可用/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

答案3

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

答案4

一个工具叫hda动词可以使用引脚启用/禁用耳机插孔。

例如,

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

./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 的来源(因为它可用)并查看他们是如何完成的。

相关内容