Linux에서 헤드폰 연결 / 연결 끊기 감지


30

헤드폰이 시스템에 연결되어 있거나 연결이 끊어졌을 때 신호를 감지하려고합니다. 가장 좋은 방법은 무엇입니까?

드라이버가있는 특수 보드가 있다면, 이것이 내가 선호하는 방법입니다.


마지막 부분을 잘 모르겠습니다. 컴퓨터에 추가 하드웨어를 연결하여이 작업을 수행 하시겠습니까?
rozcietrzewiacz

@rozcietrzewiacz-헤드폰이 연결되어 있거나 연결되어 있지 않은 경우 알림을 받아야하는 Java 앱이 있습니다. 그것이 나의 목표입니다. 추가 하드웨어를 사용하거나 사용하지 않고 제안 / 권장 사항이 있습니다.
user775633

@Gilles-아닙니다. 일반적인 하드웨어 소프트웨어에 알림을 제공합니다. 나는 이것이 U & L이라는 것을 알고 있지만, 당신은 고전적인 성가신 Windows 알림에 익숙 할 것입니다. "장치를 오디오 잭에 꽂았습니다!" i51.tinypic.com/2w2hogw.jpg . 고맙게도 리눅스는이 작업을 수행하지 않지만, 정보는 가지고있는 하드웨어에서 구할 수 있습니다. 문제는 OS가 어떻게이 정보를 이용할 수있게 하는가입니다.
Kevin Vermeer

@KevinVermeer이 특정 Windows 성가심에 익숙하지 않습니다. 최신 하드웨어가 알림을 제공한다는 사실을 알게되어 기쁩니다. 감사합니다. 리눅스는 일반적으로 /sys그때 까지 정보를 제공 하고 아마도 dbus를 통해 알림을 제공 할 것 입니다.
Gilles 'SO- 악마 중지'12

이것은 Windows 시스템이 아닙니다. 이 문제는 리눅스 OS에 대한 것입니다. 나는 더 명백해야했다. 죄송합니다! 어쨌든 기본적으로 그 알림을 잡을 수있는 쉬운 방법이없는 것처럼 보입니다. 따라서 Linux에서 실행되는 앱 에서이 신호를 포착하고 사용할 수있는 드라이버가있는 사용자 정의 카드가 있는지 확인하려고합니다.
user775633

답변:


17

내 리눅스 (데비안 GNU / 리눅스 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


이것은 Alsa 가보고 한대로 HDA Intel PCH, ALC892 Analog를 사용하는 Ubuntu 15.10 시스템에서 완벽하게 작동합니다. 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를 사용하여 파일이 수정되었는지 확인하고 정보를 파악할 수 있습니다.

https://askubuntu.com/questions/133809/mute-sound-on-headphone-unplug참조하십시오 .


1
man inotify/ proc와 같은 pseudo-fs는 inotify로 모니터링 할 수 없습니다. 해결 방법이 있습니까?
Bibek_G

@Bibek_G 예, 사용 acpi_listen하십시오 ( 이론 자의 답변 참조).
Don Hatch

하나의 사운드 카드가있는 간단한 노트북이 있지만이 audio1대신 audio0작동하기 위해 사용해야 했습니다 . 그래서 그것은 /proc/asound/card1/codec#0나를위한 것이고, 그것은 아직 당신을위한 다른 숫자 일 것입니다.
hoijui

3

시스템에서 잭의 udev 태그를 찾고 잭 연결 및 연결 해제에 대한 메시지를 DBus를 사용하여 버스를 모니터하는 클라이언트 (dbus-monitor)를 연결하십시오.


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

상태를 확인하고 싶기 때문에 Java 프로그램에서 hda를 사용하여 위의 핀 상태를 확인할 수있는 폴링 메커니즘을 사용할 수 있습니다. 이를 위해 Java 프로그램은 hda-verb를 호출 할 수 있어야합니다. 또는 hda-verb의 소스를 사용 가능한지 확인하고 어떻게했는지 확인할 수 있습니다.


0

내 노트북에는 Conexant Intel HDA 오디오 시스템이 있지만 마이크 및 헤드폰 잭 볼륨 컨트롤은 사용 가능한 많은 믹서, 심지어 alsamixer 안에 표시되지 않습니다. 마이크 및 헤드폰 스피커는 ON 또는 OFF 만 전환 할 수 있습니다. 다음은 그 작업을 수행하는 작은 스크립트입니다.

#!/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.