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:
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:
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.
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 ------------
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.
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
/sys
dahin bereit und benachrichtigt Sie möglicherweise über dbus.Antworten:
In meinem Linux (Debian GNU / Linux 3.12.0 x86_64) ist dieses Know durch ACPI - System , so Aufruf
acpi_listen
zeigt: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
quelle
Diese Informationen sind in verfügbar
/proc/asound/card0/codec#0
und 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:
Kopfhörer nicht angeschlossen (siehe
Pin-ctls
):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 .
quelle
man inotify
sagt, dass Pseudo-Fs wie / proc nicht mit inotify überwacht werden können. Gibt es eine Problemumgehung?acpi_listen
(siehe Antwort des Theisten).audio1
stattdessen verwenden,audio0
damit dies funktioniert, obwohl ich nur ein einfaches Notebook mit einer einzigen Soundkarte besitze. so ist es/proc/asound/card1/codec#0
für mich, es könnte noch eine andere Nummer für dich sein.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.
quelle
Wenn in Ihrem Kernel Klinkeneingänge konfiguriert sind
root@brix:~# grep CONFIG_SND_HDA_INPUT_JACK /boot/config-$(uname -r)
Mit können
Evtest
Sie alle Ihre Eingabeereignisse auflisten.quelle
Ein Tool namens hda-verb kann die Kopfhörerbuchse über Pins aktivieren / deaktivieren.
Beispielsweise,
Verwenden Sie zum Aktivieren der Kopfhörerbuchse:
Verwenden Sie zum Deaktivieren der Kopfhörerbuchse:
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.
quelle
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:
quelle