Rilevamento connessione / disconnessione cuffie in Linux


30

Sto cercando di rilevare un segnale quando una cuffia è collegata o scollegata dal sistema. Qual è il modo migliore per farlo?

Se c'è una scheda speciale con driver, sarà il mio modo preferito.


Non sono sicuro di aver compreso l'ultima parte: hai intenzione di farlo collegando un hardware aggiuntivo al tuo computer?
rozcietrzewiacz,

@rozcietrzewiacz - Ho un'app Java che deve essere avvisata se le cuffie sono collegate o scollegate. Questo è il mio obiettivo. Sono aperto a qualsiasi suggerimento / raccomandazione con o senza l'utilizzo di hardware aggiuntivo.
user775633

@Gilles - No, tipico hardware fa notificare al software. So che si tratta di U&L, ma probabilmente hai familiarità con la classica fastidiosa notifica di Windows: "Hai collegato un dispositivo al jack audio!" i51.tinypic.com/2w2hogw.jpg . Linux, per fortuna, non lo fa, ma le informazioni dovrebbero essere disponibili dall'hardware che hai. La domanda è come il sistema operativo rende disponibili queste informazioni.
Kevin Vermeer,

@KevinVermeer Non ho familiarità con questo particolare fastidio di Windows, no. Buono a sapersi che l'hardware moderno fornisce notifiche, grazie. In genere Linux forniva le informazioni fino a /sysquel momento e forse le notifiche tramite dbus.
Gilles 'SO- smetti di essere malvagio' il

Questo non è su un sistema Windows. Questo problema riguarda i sistemi operativi LINUX. Avrei dovuto essere più esplicito. Scusate! Ad ogni modo, per impostazione predefinita, non esiste un modo semplice per intercettare tale notifica. Ecco perché sto anche pensando di cercare se ci sono schede personalizzate che hanno un driver che intercetterà e renderà disponibile questo segnale per le app in esecuzione su Linux.
user775633

Risposte:


17

Nel mio Linux (Debian GNU / Linux 3.12.0 x86_64) questo è noto dal sistema acpi, quindi la chiamata acpi_listenmostra:

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

questo sembra dipendere da un'opzione selezionata nella configurazione del kernel CONFIG_SND_HDA_INPUT_JACK

Se questo è il tuo caso, puoi compilare /etc/acpi/events/con gli script per eseguire tutto ciò che desideri.

Controlla la pagina man acpid http://linux.die.net/man/8/acpid


Funziona perfettamente sul mio sistema Ubuntu 15.10 con HDA Intel PCH, ALC892 analogico, come riportato da Alsa. CONFIG_SND_HDA_INPUT_JACK = y è impostato.
kevinf,

14

Questa informazione è disponibile in /proc/asound/card0/codec#0e dipende dall'hardware. Per il mio computer, è nella sezione che acquisisce queste informazioni:

Cuffie collegate:

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

Cuffie disconnesse (vedi 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
[...]

È possibile utilizzare inotify per verificare se il file è stato modificato e grep le informazioni.

Vedi anche https://askubuntu.com/questions/133809/mute-sound-on-headphone-unplug .


1
man inotifydice che pseudo-f come / proc non sono monitorabili con inotify. c'è una soluzione?
Bibek_G,

@Bibek_G sì, usa acpi_listen(vedi la risposta del teista).
Don Hatch,

Ho dovuto usare audio1invece che audio0per farlo funzionare, anche se ho solo un semplice notebook con una singola scheda audio. quindi è /proc/asound/card1/codec#0per me, potrebbe essere ancora un altro numero per te.
hoijui,

3

Trova il tagger udev del jack sul sistema, collega un client (dbus-monitor) che monitora il bus utilizzando DBus per i messaggi su jack connect e disconnessioni.


2

Se il kernel ha gli ingressi jack configurati root@brix:~# grep CONFIG_SND_HDA_INPUT_JACK /boot/config-$(uname -r)

Usando Evtestpuoi elencare tutti i tuoi eventi di input.

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

Uno strumento chiamato hda-verb può abilitare / disabilitare il jack delle cuffie usando i pin.

Per esempio,

Per abilitare il jack per le cuffie, usare:

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

Per disabilitare il jack per le cuffie, usare:

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

Dato che vuoi solo controllarne lo stato, forse puoi usare un meccanismo di polling nel tuo programma java che può controllare lo stato dei pin sopra usando hda. Per questo, il tuo programma java dovrebbe essere in grado di chiamare hda-verb. In alternativa, puoi controllare l'origine di hda-verb poiché è disponibile e vedere come l'hanno fatto.


0

Il mio laptop ha un sistema audio Intel HDA Conexant, ma i controlli del volume dei jack per microfono e cuffie non vengono mai visualizzati all'interno dei molti mixer disponibili, anche alsamixer. Gli altoparlanti del microfono e delle cuffie possono essere attivati ​​o disattivati. Ecco un piccolo script per fare proprio questo:

#!/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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.