Erkennen der Verbindung / Trennung von Kopfhörern unter Linux

30

Ich versuche ein Signal zu erkennen, wenn ein Kopfhörer an das System angeschlossen oder von diesem getrennt ist. Wie geht das am besten?

Wenn es ein spezielles Board mit Treibern gibt, ist das mein bevorzugter Weg.

user775633
quelle
Ich bin nicht sicher, ob ich den letzten Teil verstehe. Beabsichtigen Sie, dies durch Anschließen einer zusätzlichen Hardware an Ihren Computer zu tun?
rozcietrzewiacz
@rozcietrzewiacz - Ich habe eine Java-App, die benachrichtigt werden muss, wenn der Kopfhörer angeschlossen oder nicht angeschlossen ist. Das ist mein ziel Ich bin offen für Vorschläge / Empfehlungen mit oder ohne Verwendung zusätzlicher Hardware.
user775633
@Gilles - Nein, typische Hardware tut Benachrichtigung an Software zur Verfügung stellen. Ich weiß, dass dies U & L ist, aber Sie kennen wahrscheinlich die klassische ärgerliche Windows-Benachrichtigung: "Sie haben ein Gerät an die Audiobuchse angeschlossen!" i51.tinypic.com/2w2hogw.jpg . Zum Glück macht Linux das nicht, aber die Informationen sollten auf der Hardware verfügbar sein, die Sie haben. Die Frage ist, wie das Betriebssystem diese Informationen zur Verfügung stellt.
Kevin Vermeer
@ KevinVermeer Ich kenne diesen speziellen Windows-Ärger nicht, nein. Gut zu wissen, dass moderne Hardware Benachrichtigung bietet, danke. In der Regel stellt Linux die Informationen bis /sysdahin bereit und benachrichtigt Sie möglicherweise über dbus.
Gilles 'SO - hör auf, böse zu sein'
Dies ist nicht auf einem Windows-System. Dieses Problem ist für Linux OS. Ich hätte expliziter sein sollen. Es tut uns leid! Es sieht jedenfalls so aus, als ob es standardmäßig keine einfache Möglichkeit gibt, diese Benachrichtigung abzufangen. Aus diesem Grund denke ich sogar darüber nach, herauszufinden, ob es benutzerdefinierte Karten mit einem Treiber gibt, der dieses Signal abfängt und für Apps unter Linux verfügbar macht.
user775633

Antworten:

17

In meinem Linux (Debian GNU / Linux 3.12.0 x86_64) ist dieses Know durch ACPI - System , so Aufruf acpi_listenzeigt:

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

Dies scheint von einer ausgewählten Option in der Kernel-Konfiguration abzuhängen CONFIG_SND_HDA_INPUT_JACK

In diesem Fall können Sie /etc/acpi/events/Skripte einfügen, um die gewünschten Aktionen auszuführen.

Überprüfen Sie die acpid-Manpage http://linux.die.net/man/8/acpid

Theist
quelle
Dies funktioniert perfekt auf meinem Ubuntu 15.10-System mit HDA Intel PCH, ALC892 Analog, wie von Alsa berichtet. CONFIG_SND_HDA_INPUT_JACK = y ist gesetzt.
Kevinf
14

Diese Informationen sind in verfügbar /proc/asound/card0/codec#0und hängen von der Hardware ab. Für meinen Computer befindet er sich in dem Abschnitt, in dem diese Informationen erfasst werden:

Kopfhörer angeschlossen:

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

Kopfhörer nicht angeschlossen (siehe 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
[...]

Sie können inotify verwenden, um zu überprüfen, ob die Datei geändert wurde, und die Informationen abzufragen.

Siehe auch https://askubuntu.com/questions/133809/mute-sound-on-headphone-unplug .

Florian Bw
quelle
1
man inotifysagt, dass Pseudo-Fs wie / proc nicht mit inotify überwacht werden können. Gibt es eine Problemumgehung?
Bibek_G
@Bibek_G ja, benutze acpi_listen(siehe Antwort des Theisten).
Don Hatch
Ich musste audio1stattdessen verwenden, audio0damit dies funktioniert, obwohl ich nur ein einfaches Notebook mit einer einzigen Soundkarte besitze. so ist es /proc/asound/card1/codec#0für mich, es könnte noch eine andere Nummer für dich sein.
Hoijui
3

Suchen Sie den udev-Tagger der Buchse auf dem System, schließen Sie einen Client (dbus-monitor) an, der den Bus mithilfe von DBus auf Meldungen zum Verbinden und Trennen der Buchse überwacht.

Nikhil Mulley
quelle
2

Wenn in Ihrem Kernel Klinkeneingänge konfiguriert sind root@brix:~# grep CONFIG_SND_HDA_INPUT_JACK /boot/config-$(uname -r)

Mit können EvtestSie alle Ihre Eingabeereignisse auflisten.

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 ------------
kevinf
quelle
2

Ein Tool namens hda-verb kann die Kopfhörerbuchse über Pins aktivieren / deaktivieren.

Beispielsweise,

Verwenden Sie zum Aktivieren der Kopfhörerbuchse:

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

Verwenden Sie zum Deaktivieren der Kopfhörerbuchse:

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

Da Sie nur den Status überprüfen möchten, können Sie in Ihrem Java-Programm möglicherweise einen Abfragemechanismus verwenden, mit dem Sie den Status der obigen Pins mithilfe von hda überprüfen können. Zu diesem Zweck sollte Ihr Java-Programm in der Lage sein, hda-verb aufzurufen. Alternativ können Sie die Quelle von hda-verb überprüfen, sobald diese verfügbar ist, und sehen, wie sie es getan haben.

Omar Khan
quelle
0

Mein Laptop ist mit einem Intel HDA-Audiosystem von Conexant ausgestattet, aber die Lautstärkeregler für Mikrofon und Kopfhörer werden in den vielen verfügbaren Mischpulten nicht angezeigt, auch nicht im Mixer. Die Mikrofon- und Kopfhörerlautsprecher können nur ein- oder ausgeschaltet werden. Hier ist ein kleines Skript, um genau das zu tun:

#!/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
rmstock
quelle