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

use*_*633 37 linux hardware audio

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

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

the*_*ist 23

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

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

如果这是您的情况,您可以填充 /etc/acpi/events/脚本以触发您想要的任何内容。

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


小智 16

此信息/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:
[...]
Run Code Online (Sandbox Code Playgroud)

耳机已断开(请参阅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
[...]
Run Code Online (Sandbox Code Playgroud)

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

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

  • `man inotify` 表示像 /proc 这样的伪文件系统无法使用 inotify 进行监控。有解决方法吗? (2认同)

Oma*_*han 2

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

例如,

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

./hda-verb /dev/snd/hwC0D0 0x0f SET_PIN_WIDGET_CONTROL 0x40
Run Code Online (Sandbox Code Playgroud)

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

./hda-verb /dev/snd/hwC0D0 0x0f SET_PIN_WIDGET_CONTROL 0
Run Code Online (Sandbox Code Playgroud)

由于您只想检查其状态,也许您可​​以在 java 程序中使用某种轮询机制,该机制可以使用 hda 检查上述引脚的状态。为此,您的 java 程序应该能够调用 hda-verb。或者,您可以检查 hda-verb 的来源(因为它可用)并查看他们是如何完成的。