Phát hiện kết nối / ngắt kết nối tai nghe trong Linux


30

Tôi đang cố gắng phát hiện tín hiệu khi tai nghe được kết nối hoặc ngắt kết nối với hệ thống. Cách tốt nhất để làm việc này là gì?

Nếu có một bảng đặc biệt với các trình điều khiển, đó sẽ là cách ưa thích của tôi.


Tôi không chắc là tôi hiểu phần cuối - bạn có định làm điều này bằng cách kết nối một phần cứng bổ sung với máy tính của bạn không?
rozcietrzewiacz

@rozcietrzewiacz - Tôi có một ứng dụng java cần được thông báo nếu tai nghe được cắm hoặc rút phích cắm. Đó là mục tiêu của tôi. Tôi sẵn sàng cho bất kỳ đề xuất / đề xuất nào có hoặc không sử dụng phần cứng bổ sung.
user775633

@Gilles - Không, phần cứng thông thường không cung cấp thông báo cho phần mềm. Tôi biết đây là U & L, nhưng bạn có thể quen với thông báo Windows gây phiền nhiễu cổ điển: "Bạn đã cắm thiết bị vào giắc âm thanh!" i51.tinypic.com/2w2oosew.jpg . Rất may, Linux không làm điều này, nhưng thông tin nên có sẵn từ phần cứng bạn có. Câu hỏi là làm thế nào hệ điều hành làm cho thông tin này có sẵn.
Kevin Vermeer

@KevinVermeer Tôi không quen với sự phiền toái đặc biệt này của Windows, không. Thật tốt khi biết rằng phần cứng hiện đại cung cấp thông báo, cảm ơn bạn. Linux thường sẽ cung cấp thông tin qua /sysđó và có lẽ thông báo qua dbus.
Gilles 'SO- ngừng trở nên xấu xa'

Đây không phải là trên một hệ thống cửa sổ. Vấn đề này là dành cho hệ điều hành LINUX. Tôi nên đã rõ ràng hơn. Lấy làm tiếc! Dù sao, có vẻ như mặc định không có cách nào dễ dàng để bẫy thông báo đó .. Đó là lý do tại sao tôi thậm chí nghĩ đến việc xem có thẻ tùy chỉnh nào có trình điều khiển sẽ bẫy và cung cấp tín hiệu này cho các ứng dụng chạy trên linux.
user775633

Câu trả lời:


17

Trong linux của tôi (Debian GNU / Linux 3.12.0 x86_64) điều này được hệ thống acpi biết đến nên việc gọi acpi_listenchương trình:

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

điều này dường như phụ thuộc vào một tùy chọn được chọn trong cấu hình kernel CONFIG_SND_HDA_INPUT_JACK

Nếu đây là trường hợp của bạn, bạn có thể điền /etc/acpi/events/vào các tập lệnh để kích hoạt bất kỳ thứ gì bạn muốn.

Kiểm tra trang người đàn ông acpid http://linux.die.net/man/8/acpid


Điều này hoạt động hoàn hảo trên hệ thống Ubuntu 15.10 của tôi với HDA Intel PCH, ALC892 Analog, theo báo cáo của Alsa. CONFIG_SND_HDA_INPUT_JACK = y được đặt.
kevinf

14

Thông tin này có sẵn trong /proc/asound/card0/codec#0và phụ thuộc vào phần cứng. Đối với máy tính của tôi, nó nằm trong phần ghi lại thông tin này:

Tai nghe được kết nối:

[...]
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:
[...]

Tai nghe bị ngắt kết nối (xem 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
[...]

Bạn có thể sử dụng inotify để kiểm tra xem tệp đã được sửa đổi và grep thông tin.

Xem thêm https://askubfox.com/questions/133809/mute-sound-on-headphone-unplug .


1
man inotifynói giả như f / Proc không thể theo dõi được với inotify. có một cách giải quyết?
Bibek_G

@Bibek_G có, sử dụng acpi_listen(xem câu trả lời của nhà lý luận).
Don nở

Tôi đã phải sử dụng audio1thay vì audio0để nó hoạt động, mặc dù tôi chỉ có một cuốn sổ tay đơn giản với một card âm thanh duy nhất. Vì vậy, nó là /proc/asound/card1/codec#0cho tôi, nó có thể là một số khác cho bạn.
hoijui

3

Tìm trình gắn thẻ udev của jack trên Hệ thống, kết nối máy khách (màn hình dbus) theo dõi xe buýt bằng DBus cho các tin nhắn về kết nối và ngắt kết nối jack.


2

Nếu kernel của bạn có jack đầu vào được cấu hình root@brix:~# grep CONFIG_SND_HDA_INPUT_JACK /boot/config-$(uname -r)

Sử dụng Evtestbạn có thể liệt kê tất cả các sự kiện đầu vào của bạn.

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

Một công cụ có tên hda-verb có thể bật / tắt giắc cắm tai nghe bằng các chân.

Ví dụ,

Để bật giắc cắm tai nghe, hãy sử dụng:

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

Để tắt giắc cắm tai nghe, hãy sử dụng:

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

Vì bạn chỉ muốn kiểm tra trạng thái của nó, có lẽ bạn có thể sử dụng một số cơ chế bỏ phiếu trong chương trình java có thể kiểm tra trạng thái của các chân trên bằng hda. Đối với điều này, chương trình java của bạn sẽ có thể gọi hda-verb. Ngoài ra, bạn có thể kiểm tra nguồn của động từ hda vì nó có sẵn và xem họ đã làm như thế nào.


0

Máy tính xách tay của tôi có hệ thống âm thanh Intel HDA của Conexant, nhưng các nút điều khiển âm lượng mic và giắc cắm tai nghe không bao giờ xuất hiện bên trong nhiều bộ trộn có sẵn, thậm chí là alsamixer. Mic và loa tai nghe chỉ có thể được BẬT hoặc TẮT. Đây là một kịch bản nhỏ để làm điều đó:

#!/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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.