ตรวจจับการเชื่อมต่อหูฟัง / ตัดการเชื่อมต่อใน Linux


30

ฉันพยายามตรวจจับสัญญาณเมื่อเชื่อมต่อหูฟังหรือตัดการเชื่อมต่อจากระบบ วิธีที่ดีที่สุดในการทำเช่นนี้คืออะไร?

หากมีบอร์ดพิเศษพร้อมไดรเวอร์นั่นจะเป็นวิธีที่ฉันชอบ


ฉันไม่แน่ใจว่าฉันเข้าใจส่วนสุดท้าย - คุณตั้งใจจะทำสิ่งนี้ด้วยการเชื่อมต่อฮาร์ดแวร์เพิ่มเติมกับคอมพิวเตอร์ของคุณหรือไม่?
rozcietrzewiacz

@rozcietrzewiacz - ฉันมีแอป java ที่ต้องได้รับการแจ้งเตือนหากหูฟังถูกเสียบหรือถอดปลั๊ก นั่นคือเป้าหมายของฉัน ฉันเปิดให้คำแนะนำ / คำแนะนำใด ๆ ที่มีหรือไม่มีการใช้ฮาร์ดแวร์เพิ่มเติม
user775633

@Gilles - ไม่มีฮาร์ดแวร์ทั่วไปไม่ให้แจ้งเตือนไปยังซอฟแวร์ ฉันรู้ว่านี่คือ U&L แต่คุณอาจคุ้นเคยกับการแจ้งเตือน Windows ที่น่ารำคาญแบบคลาสสิก: "คุณได้เสียบอุปกรณ์เข้ากับแจ็คเสียง!" i51.tinypic.com/2w2hogw.jpg Linux โชคดีที่ไม่ได้ทำเช่นนี้ แต่ควรมีข้อมูลจากฮาร์ดแวร์ที่คุณมี คำถามคือระบบปฏิบัติการทำให้ข้อมูลนี้พร้อมใช้งานได้อย่างไร
Kevin Vermeer

@KevinVermeer ฉันไม่คุ้นเคยกับ Windows ที่น่ารำคาญนี้ ดีใจที่ทราบว่าฮาร์ดแวร์ที่ทันสมัยให้การแจ้งเตือนขอบคุณ โดยทั่วไปแล้ว Linux จะให้ข้อมูลผ่าน/sysและอาจแจ้งเตือนผ่านทาง dbus
Gilles 'หยุดความชั่วร้าย'

นี่ไม่ได้อยู่ในระบบ windows ปัญหานี้มีไว้สำหรับระบบปฏิบัติการ Linux ฉันควรจะชัดเจนมากขึ้น ขออภัย! ดูเหมือนว่าโดยค่าเริ่มต้นไม่มีวิธีง่ายๆในการดักจับการแจ้งเตือนนั้น .. นั่นเป็นเหตุผลที่ฉันยังคิดที่จะดูว่ามีการ์ดแบบกำหนดเองที่มีไดรเวอร์ที่จะดักจับและทำให้สัญญาณนี้พร้อมใช้งานสำหรับแอปที่ทำงานบน linux
user775633

คำตอบ:


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/ด้วยสคริปต์เพื่อดำเนินการใด ๆ ที่คุณต้องการ

ตรวจสอบหน้า man ของ acpid http://linux.die.net/man/8/acpid


สิ่งนี้ทำงานได้อย่างสมบูรณ์บนระบบ Ubuntu 15.10 ของฉันด้วย HDA Intel PCH, ALC892 Analog ตามที่รายงานโดย Alsa CONFIG_SND_HDA_INPUT_JACK = y ถูกตั้งค่า
kevinf

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กล่าวว่า pseudo-fs เช่น / proc ไม่สามารถมอนิเตอร์ได้ด้วย inotify มีวิธีแก้ปัญหาหรือไม่?
Bibek_G

@Bibek_G ใช่ใช้acpi_listen(ดูคำตอบของtheist )
Don Hatch

ฉันต้องใช้audio1แทนaudio0สิ่งนี้ในการทำงานแม้ว่าฉันจะมีโน๊ตบุ๊คธรรมดาที่มีการ์ดเสียงเดียว ดังนั้น/proc/asound/card1/codec#0สำหรับฉันมันอาจจะเป็นหมายเลขอื่นสำหรับคุณ
hoijui

3

ค้นหา udev tagger ของแจ็คบนระบบเชื่อมต่อไคลเอนต์ (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

เนื่องจากคุณเพียงแค่ต้องการตรวจสอบสถานะของมันบางทีคุณสามารถใช้กลไกการสำรวจในโปรแกรมจาวาของคุณซึ่งสามารถตรวจสอบสถานะของหมุดด้านบนโดยใช้ 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.