No estoy seguro de entender la última parte: ¿tiene intención de hacer esto conectando un hardware adicional a su computadora?
rozcietrzewiacz
@rozcietrzewiacz: tengo una aplicación de Java que debe ser notificada si los auriculares están conectados o desconectados. Ese es mi objetivo. Estoy abierto a cualquier sugerencia / recomendación con o sin el uso de hardware adicional.
user775633
@Gilles - No, el hardware típico hace notificar al software. Sé que esto es U&L, pero probablemente estés familiarizado con la clásica y molesta notificación de Windows: "¡Has enchufado un dispositivo en el conector de audio!" i51.tinypic.com/2w2hogw.jpg . Linux, afortunadamente, no hace esto, pero la información debería estar disponible desde el hardware que tienes. La pregunta es cómo el sistema operativo hace que esta información esté disponible.
Kevin Vermeer
@KevinVermeer No estoy familiarizado con esta molestia particular de Windows, no. Es bueno saber que el hardware moderno proporciona notificaciones, gracias. Linux normalmente proporcionaría la información hasta /sysese momento, y tal vez notificaciones a través de dbus.
Gilles 'SO- deja de ser malvado'
Esto no está en un sistema de Windows. Este problema es para LINUX os. Debería haber sido más explícito. ¡Lo siento! De todos modos, parece que no hay una forma fácil de atrapar esa notificación. Es por eso que incluso estoy pensando en ver si hay alguna tarjeta personalizada que tenga un controlador que atrape y haga que esta señal esté disponible para aplicaciones que se ejecutan en Linux.
user775633
Respuestas:
17
En mi linux (Debian GNU / Linux 3.12.0 x86_64) esto es conocido por el sistema acpi, por lo que llamar acpi_listenmuestra:
Esto funciona perfectamente en mi sistema Ubuntu 15.10 con HDA Intel PCH, ALC892 Analog, según lo informado por Alsa. CONFIG_SND_HDA_INPUT_JACK = y se establece.
kevinf
14
Esta información está disponible /proc/asound/card0/codec#0y depende del hardware. Para mi computadora, está en la sección que captura esta información:
man inotifydice que los pseudo-fs como / proc no son controlables con inotify. ¿hay alguna solución?
Bibek_G
@Bibek_G sí, use acpi_listen(vea la respuesta del teísta).
Don Hatch
Tuve que usar en audio1lugar de audio0para que esto funcione, a pesar de que solo tengo una computadora portátil simple con una sola tarjeta de sonido. así que es /proc/asound/card1/codec#0para mí, podría ser otro número más para ti.
hoijui
3
Encuentre el etiquetador udev del jack en el Sistema, conecte un cliente (dbus-monitor) que monitorea el bus usando DBus para mensajes en las conexiones y desconexiones de jack.
Si su kernel tiene entradas de jack configuradas
root@brix:~# grep CONFIG_SND_HDA_INPUT_JACK /boot/config-$(uname -r)
Utilizando Evtestpuede enumerar todos sus eventos de entrada.
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 ------------
Como solo desea verificar su estado, tal vez pueda usar algún mecanismo de sondeo en su programa java que pueda verificar el estado de los pines anteriores usando hda. Para esto, su programa java debería poder llamar hda-verb. Alternativamente, puede verificar la fuente del verbo hda ya que está disponible y ver cómo lo han hecho.
Mi computadora portátil tiene un sistema de audio Conexant Intel HDA, pero los controles de volumen de los conectores de micrófono y auriculares nunca se muestran dentro de los muchos mezcladores disponibles, incluso alsamixer. Los altavoces de micrófono y auriculares solo se pueden encender o apagar. Aquí hay un pequeño script para hacer exactamente eso:
#!/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
ese momento, y tal vez notificaciones a través de dbus.Respuestas:
En mi linux (Debian GNU / Linux 3.12.0 x86_64) esto es conocido por el sistema acpi, por lo que llamar
acpi_listen
muestra:Esto parece depender de una opción seleccionada en la configuración del núcleo
CONFIG_SND_HDA_INPUT_JACK
Si este es su caso, puede llenar
/etc/acpi/events/
con scripts para disparar cualquier cosa que desee.Consulte la página de manual de acpid http://linux.die.net/man/8/acpid
fuente
Esta información está disponible
/proc/asound/card0/codec#0
y depende del hardware. Para mi computadora, está en la sección que captura esta información:Auriculares conectados:
Auriculares desconectados (ver
Pin-ctls
):Puede usar inotify para verificar si el archivo se modificó y obtener la información.
Ver también https://askubuntu.com/questions/133809/mute-sound-on-headphone-unplug .
fuente
man inotify
dice que los pseudo-fs como / proc no son controlables con inotify. ¿hay alguna solución?acpi_listen
(vea la respuesta del teísta).audio1
lugar deaudio0
para que esto funcione, a pesar de que solo tengo una computadora portátil simple con una sola tarjeta de sonido. así que es/proc/asound/card1/codec#0
para mí, podría ser otro número más para ti.Encuentre el etiquetador udev del jack en el Sistema, conecte un cliente (dbus-monitor) que monitorea el bus usando DBus para mensajes en las conexiones y desconexiones de jack.
fuente
Si su kernel tiene entradas de jack configuradas
root@brix:~# grep CONFIG_SND_HDA_INPUT_JACK /boot/config-$(uname -r)
Utilizando
Evtest
puede enumerar todos sus eventos de entrada.fuente
Una herramienta llamada hda-verb puede habilitar / deshabilitar la toma de auriculares con pines.
Por ejemplo,
Para habilitar la toma de auriculares, use:
Para deshabilitar la toma de auriculares, use:
Como solo desea verificar su estado, tal vez pueda usar algún mecanismo de sondeo en su programa java que pueda verificar el estado de los pines anteriores usando hda. Para esto, su programa java debería poder llamar hda-verb. Alternativamente, puede verificar la fuente del verbo hda ya que está disponible y ver cómo lo han hecho.
fuente
Mi computadora portátil tiene un sistema de audio Conexant Intel HDA, pero los controles de volumen de los conectores de micrófono y auriculares nunca se muestran dentro de los muchos mezcladores disponibles, incluso alsamixer. Los altavoces de micrófono y auriculares solo se pueden encender o apagar. Aquí hay un pequeño script para hacer exactamente eso:
fuente