Linuxでのヘッドフォンの接続/切断の検出


30

ヘッドフォンがシステムに接続または切断されたときに信号を検出しようとしています。これを行う最良の方法は何ですか?

ドライバー付きの特別なボードがある場合、それが私の好ましい方法です。


最後の部分を理解しているかどうかわかりません-追加のハードウェアをコンピューターに接続してこれを行うつもりですか?
rozcietrzewiacz

@rozcietrzewiacz-ヘッドフォンが接続されているか、接続されていないかを通知する必要があるJavaアプリがあります。それが私の目標です。追加のハードウェアを使用して、または使用せずに、提案や推奨事項を受け入れます。
user775633

@Gilles-いいえ、典型的なハードウェアソフトウェアに通知を提供します。これがU&Lであることは知っていますが、「Windowsのデバイスをオーディオジャックに接続しました!」i51.tinypic.com/2w2hogw.jpg。ありがたいことに、Linuxはこれを行いませんが、入手したハードウェアから情報を入手できるはずです。問題は、OSがこの情報をどのように利用可能にするかです。
ケビンフェルメール

@KevinVermeer私はたまたまこの特定のWindowsのイライラに精通していません。最新のハードウェアが通知を提供することを知っていただきありがとうございます。Linuxは通常、/sysそれまでに情報を提供し、おそらくdbusを介して通知を提供します。
ジル「SO-悪であるのをやめる」

これはWindowsシステムではありません。この問題は、Linux OS向けです。もっと明確にすべきでした。ごめんなさい!とにかく、デフォルトではその通知をトラップする簡単な方法はないように見えます。だから、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/スクリプトを入力して、必要なものを起動でき ます。

acpid manページhttp://linux.die.net/man/8/acpidを確認してください


これは、Alsaが報告したように、HDA Intel PCH、ALC892 Analogを搭載したUbuntu 15.10システムで完全に機能します。CONFIG_SND_HDA_INPUT_JACK = yが設定されています。
ケビン

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/ procのようなpseudo-fsはinotifyで監視できないと言います。回避策はありますか?
Bibek_G

@Bibek_Gはい、使用しますacpi_listen(有神論者の答えを参照)。
ドンハッチ

サウンドカードが1枚しかないシンプルなノートブックを持っている場合でも、これを機能させるために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

ステータスを確認したいだけなので、おそらくhdaを使用して上記のピンのステータスを確認できるポーリングプログラムをJavaプログラムで使用できます。このため、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.