Обнаружение соединения/разъединения наушника в Linux

Это работало на меня:

kpartx -av cento.img

И монтирование циклического устройства, созданного в /dev/mapper:

sudo mount /dev/mapper/loop0p1 /mnt/destination
30
05.10.2013, 15:37
7 ответов

Найдите udev теггер разъема в Системе, соедините клиент (dbus-монитор), который контролирует шину с помощью DBus для сообщений на подключении разъема и разъединениях.

3
27.01.2020, 19:38

Инструмент звонил, hda-глагол может позволить/запретить гнездо для наушников с помощью контактов.

Например,

Для включения гнезда для наушников используйте:

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

Для отключения гнезда для наушников используйте:

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

Так как Вы просто хотите проверить его состояние, возможно, можно использовать некоторый механизм опроса в программе Java, которая может проверить состояние вышеупомянутых контактов с помощью hda. Для этого Ваша программа Java должна смочь назвать hda-глагол. С другой стороны, можно проверить источник hda-глагола, поскольку это доступно, и посмотрите, как они сделали его.

2
27.01.2020, 19:38

Эта информация доступна в /proc/asound/card0/codec#0 и зависит от аппаратных средств. Для моего компьютера это находится в разделе, который получает эту информацию:

Наушник соединен:

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

Наушник разъединился (см. 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
[...]

Вы могли использовать inotify, чтобы проверить, был ли файл изменен и grep информация.

См. также https://askubuntu.com/questions/133809/mute-sound-on-headphone-unplug.

14
27.01.2020, 19:38
  • 1
    ответа man inotify говорит, что псевдофс как/proc не monitorable с inotify., там обходное решение? –  Bibek_G 12.02.2016, 13:17
[118063] В моём linux (Debian GNU/Linux 3.12. 0 x86_64) это известно системе acpi, поэтому вызов [118430]acpi_listen[118431] показывает:

="INSERT INTO MyTable (ISAM_ID, ENTITY, CUSTOMER_MEDIA,STATUS,IIN,OID,FVC)"
  & " VALUES (" & A2 & ", '" & B2 & "', '" & C2 
  & "', '" & D2 & "','" & E2 & "', '" & F2 & "', '" & G2 & "', '" & H2 & "');"

это, кажется, зависит от выбранной опции в конфигурации ядра [118432]CONFIG_SND_HDA_INPUT_JACK

INSERT INTO MyTable (ISAM_ID, ENTITY, CUSTOMER_MEDIA,STATUS,IIN,OID,FVC)
   VALUES ( 10001, 'ErferrRR01','MP3','LOADED'
   ,'RRGEE', '232133122dfcsdds212121','TGEE');
Если это ваш случай, вы можете заполнить [118434]/etc/acpi/events/[118435] скриптами для запуска любого желаемого вами скрипта.

enter image description here

Проверьте acpid man page [118436]http://linux.die.net/man/8/acpid

17
27.01.2020, 19:38

Если в вашем ядре настроены входы jack root @ brix: ~ # grep CONFIG_SND_HDA_INPUT_JACK / boot / config - $ (uname - r)

Используя Evtest , вы можете перечислить все свои входные события.

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
20.08.2021, 13:31

Мой ноутбук оснащен аудиосистемой Conexant Intel HDA, но микрофон и регуляторы громкости разъема для наушников никогда не отображаются внутри многих микшеров доступен, даже alsamixer. Динамики микрофона и наушников можно только включить или выключить. Вот небольшой скрипт для этого:

#!/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
0
20.08.2021, 13:31

@kevinf уже упоминал программу evtest. Есть ответ на другой вопрос со скриптом bash -1 . На основе этого я создал программу на Python :

.
#!/usr/bin/env python

# add user to group 'input' to get access to /dev/input/event*
# sudo usermod -a -G input $USER

from re import compile
from os import geteuid
from subprocess import Popen, PIPE, call

if geteuid() == 0:
  print("Must be run as user to receive notifications. Add user to group 'input', `sudo usermod -a -G input $USER`.")
  exit()

# find out the event number with running `sudo evtest` and looking for "HDA Intel PCH Headphone"
p = Popen(["evtest", '/dev/input/event14'], stdout=PIPE)

# reading from process
# https://stackoverflow.com/a/28319191/6040478
mask = compile('SW_HEADPHONE_INSERT.*value 1')
for line in p.stdout:
  if mask.search(line.decode('utf-8')) != None:
    print('plugged in')
    call(['notify-send', 'Headset'])

Вам придется адаптировать его для Java.

1https://unix.stackexchange.com/a/472517/218172)

0
20.08.2021, 13:31

Теги

Похожие вопросы