Não sei se entendi a última parte - você pretende fazer isso conectando um hardware adicional ao seu computador?
rozcietrzewiacz
@rozcietrzewiacz - Eu tenho um aplicativo java que precisa ser notificado se o fone de ouvido estiver conectado ou desconectado. Esse é o meu objetivo. Estou aberto a sugestões / recomendações com ou sem o uso de hardware adicional.
user775633
@Gilles - Não, hardware típico faz fornecer notificação ao software. Sei que isso é U&L, mas você provavelmente conhece a notificação clássica e irritante do Windows: "Você conectou um dispositivo à entrada de áudio!" i51.tinypic.com/2w2hogw.jpg . Felizmente, o Linux não faz isso, mas as informações devem estar disponíveis no hardware que você possui. A questão é como o sistema operacional disponibiliza essas informações.
Kevin Vermeer
@KevinVermeer Por acaso não estou familiarizado com esse aborrecimento específico do Windows, não. É bom saber que o hardware moderno fornece notificação, obrigado. O Linux normalmente forneceria as informações até /sysentão, e talvez notificações via dbus.
Gilles 'SO- stop be evil'
Isso não está em um sistema Windows. Este problema é para os Linux. Eu deveria ter sido mais explícito. Desculpe! De qualquer forma, parece que, por padrão, não há uma maneira fácil de interceptar essa notificação. É por isso que estou pensando em verificar se há algum cartão personalizado com um driver que intercepte e disponibilize esse sinal para aplicativos em execução no Linux.
precisa saber é o seguinte
Respostas:
17
No meu linux (Debian GNU / Linux 3.12.0 x86_64) isso é conhecido pelo sistema acpi, como acpi_listenmostra:
Isso funciona perfeitamente no meu sistema Ubuntu 15.10 com HDA Intel PCH, ALC892 Analog, conforme relatado por Alsa. CONFIG_SND_HDA_INPUT_JACK = y está definido.
kevinf
14
Esta informação está disponível /proc/asound/card0/codec#0e depende do hardware. Para o meu computador, está na seção que captura essas informações:
man inotifydiz que pseudo-fs como / proc não são monitoráveis com o inotify. existe uma solução alternativa?
Bibek_G 12/02/16
@Bibek_G sim, use acpi_listen(veja a resposta do teísta).
Don escotilha
Eu tive que usar em audio1vez disso audio0para que isso funcionasse, mesmo que eu tenha apenas um notebook simples com uma única placa de som. então é /proc/asound/card1/codec#0para mim, pode ser outro número para você.
hoijui
3
Encontre o etiquetador udev da tomada no sistema, conecte um cliente (dbus-monitor) que monitore o barramento usando o DBus para obter mensagens sobre a conexão e desconexão da tomada.
Se o seu kernel possui entradas de jack configuradas
root@brix:~# grep CONFIG_SND_HDA_INPUT_JACK /boot/config-$(uname -r)
Usando Evtestvocê pode listar todos os seus 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 você deseja apenas verificar seu status, talvez você possa usar algum mecanismo de pesquisa em seu programa java que pode verificar o status dos pinos acima usando hda. Para isso, seu programa java deve poder chamar hda-verb. Como alternativa, você pode verificar a fonte do hda-verbo disponível e ver como eles o fizeram.
Meu laptop possui um sistema de áudio Conexant Intel HDA, mas os controles de volume do microfone e do fone de ouvido nunca aparecem nos diversos mixers disponíveis, mesmo no mesmo mixer. Os alto-falantes do microfone e dos fones de ouvido só podem ser ligados ou desligados. Aqui está um pequeno script para fazer exatamente isso:
#!/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
então, e talvez notificações via dbus.Respostas:
No meu linux (Debian GNU / Linux 3.12.0 x86_64) isso é conhecido pelo sistema acpi, como
acpi_listen
mostra:isso parece depender de uma opção selecionada na configuração do kernel
CONFIG_SND_HDA_INPUT_JACK
Se este for o seu caso, você pode preencher
/etc/acpi/events/
com scripts para disparar o que quiser.Verifique a página de manual do acpid http://linux.die.net/man/8/acpid
fonte
Esta informação está disponível
/proc/asound/card0/codec#0
e depende do hardware. Para o meu computador, está na seção que captura essas informações:Fone de ouvido conectado:
Fone de ouvido desconectado (consulte
Pin-ctls
):Você pode usar o inotify para verificar se o arquivo foi modificado e grep as informações.
Veja também https://askubuntu.com/questions/133809/mute-sound-on-headphone-unplug .
fonte
man inotify
diz que pseudo-fs como / proc não são monitoráveis com o inotify. existe uma solução alternativa?acpi_listen
(veja a resposta do teísta).audio1
vez dissoaudio0
para que isso funcionasse, mesmo que eu tenha apenas um notebook simples com uma única placa de som. então é/proc/asound/card1/codec#0
para mim, pode ser outro número para você.Encontre o etiquetador udev da tomada no sistema, conecte um cliente (dbus-monitor) que monitore o barramento usando o DBus para obter mensagens sobre a conexão e desconexão da tomada.
fonte
Se o seu kernel possui entradas de jack configuradas
root@brix:~# grep CONFIG_SND_HDA_INPUT_JACK /boot/config-$(uname -r)
Usando
Evtest
você pode listar todos os seus eventos de entrada.fonte
Uma ferramenta chamada hda-verb pode ativar / desativar o fone de ouvido usando pinos.
Por exemplo,
Para ativar o fone de ouvido, use:
Para desativar o fone de ouvido, use:
Como você deseja apenas verificar seu status, talvez você possa usar algum mecanismo de pesquisa em seu programa java que pode verificar o status dos pinos acima usando hda. Para isso, seu programa java deve poder chamar hda-verb. Como alternativa, você pode verificar a fonte do hda-verbo disponível e ver como eles o fizeram.
fonte
Meu laptop possui um sistema de áudio Conexant Intel HDA, mas os controles de volume do microfone e do fone de ouvido nunca aparecem nos diversos mixers disponíveis, mesmo no mesmo mixer. Os alto-falantes do microfone e dos fones de ouvido só podem ser ligados ou desligados. Aqui está um pequeno script para fazer exatamente isso:
fonte