我试图在耳机与系统连接或断开连接时检测信号。做这个的最好方式是什么?
如果有专门的板子和驱动程序,那将是我的首选方式。
答案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 的来源(因为它可用)并查看他们是如何完成的。