Я не уверен, что понимаю последнюю часть - вы намерены сделать это, подключив дополнительное оборудование к вашему компьютеру?
rozcietrzewiacz
@rozcietrzewiacz - у меня есть Java-приложение, которое нужно получать, если наушники подключены или отключены. Это моя цель. Я открыт для любых предложений / рекомендаций с использованием или без использования дополнительного оборудования.
user775633
@Gilles - Нет, типичное аппаратное обеспечение делает предоставляет уведомление программного обеспечения. Я знаю, что это U & L, но вы, вероятно, знакомы с классическим раздражающим уведомлением Windows: «Вы подключили устройство к аудиоразъему!» i51.tinypic.com/2w2hogw.jpg . К счастью, Linux этого не делает, но информация должна быть доступна на имеющемся у вас оборудовании. Вопрос в том, как ОС делает эту информацию доступной.
Кевин Вермеер
@KevinVermeer Я не знаком с этим конкретным раздражением Windows, нет. Хорошо знать, что современное оборудование обеспечивает уведомление, спасибо. Linux обычно предоставляет информацию через /sysнее и, возможно, уведомления через dbus.
Жиль "ТАК - перестать быть злым"
Это не в системе Windows. Эта проблема для ОС Linux. Я должен был быть более явным. Сожалею! В любом случае, похоже, что по умолчанию нет простого способа перехвата этого уведомления. Вот почему я даже думаю о том, чтобы посмотреть, есть ли какие-нибудь пользовательские карты с драйвером, который перехватит этот сигнал и сделает его доступным для приложений, работающих в Linux.
user775633
Ответы:
17
В моем linux (Debian GNU / Linux 3.12.0 x86_64) это известно системе acpi, поэтому вызов acpi_listenпоказывает:
Это прекрасно работает на моей системе Ubuntu 15.10 с HDA Intel PCH, ALC892 Analog, как сообщает Alsa. CONFIG_SND_HDA_INPUT_JACK = y установлено.
Кевинф
14
Эта информация доступна /proc/asound/card0/codec#0и зависит от аппаратного обеспечения. Для моего компьютера, это в разделе, который захватывает эту информацию:
man inotifyговорит, что псевдо-фы вроде / proc не контролируются с inotify. есть ли обходной путь?
Bibek_G
@Bibek_G да, используйте acpi_listen(см. Ответ теиста).
Дон Хэтч
Мне пришлось использовать audio1вместо audio0этого для работы, хотя у меня просто простой ноутбук с одной звуковой картой. так что /proc/asound/card1/codec#0для меня, это может быть еще один номер для вас.
hoijui
3
Найдите тег udev для разъема в системе, подключите клиент (dbus-monitor), который контролирует шину с помощью DBus для сообщений о подключении и отключении разъема.
Если в вашем ядре настроены входные разъемы
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 ------------
Поскольку вы просто хотите проверить его состояние, возможно, вы можете использовать какой-либо механизм опроса в вашей java-программе, который может проверять состояние вышеупомянутых пинов с помощью hda. Для этого ваша java-программа должна иметь возможность вызывать hda-verb. Кроме того, вы можете проверить источник hda-глагола, как он доступен, и посмотреть, как они это сделали.
Мой ноутбук оснащен аудиосистемой Conexant Intel HDA, но регуляторы громкости микрофона и наушников никогда не отображаются во многих доступных микшерах, даже в микшере. Динамики микрофона и наушников можно только включить или выключить. Вот крошечный скрипт для этого:
#!/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
нее и, возможно, уведомления через dbus.Ответы:
В моем linux (Debian GNU / Linux 3.12.0 x86_64) это известно системе acpi, поэтому вызов
acpi_listen
показывает:кажется, это зависит от выбранной опции в конфигурации ядра
CONFIG_SND_HDA_INPUT_JACK
Если это ваш случай, вы можете заполнить
/etc/acpi/events/
скриптами, чтобы запустить что угодно.Проверьте страницу руководства acpid http://linux.die.net/man/8/acpid
источник
Эта информация доступна
/proc/asound/card0/codec#0
и зависит от аппаратного обеспечения. Для моего компьютера, это в разделе, который захватывает эту информацию:Наушники подключены:
Наушники отключены (см.
Pin-ctls
):Вы можете использовать inotify, чтобы проверить, был ли файл изменен, и получить информацию.
Смотрите также https://askubuntu.com/questions/133809/mute-sound-on-headphone-unplug .
источник
man inotify
говорит, что псевдо-фы вроде / proc не контролируются с inotify. есть ли обходной путь?acpi_listen
(см. Ответ теиста).audio1
вместоaudio0
этого для работы, хотя у меня просто простой ноутбук с одной звуковой картой. так что/proc/asound/card1/codec#0
для меня, это может быть еще один номер для вас.Найдите тег udev для разъема в системе, подключите клиент (dbus-monitor), который контролирует шину с помощью DBus для сообщений о подключении и отключении разъема.
источник
Если в вашем ядре настроены входные разъемы
root@brix:~# grep CONFIG_SND_HDA_INPUT_JACK /boot/config-$(uname -r)
С помощью
Evtest
вы можете перечислить все ваши входные события.источник
Инструмент под названием hda-verb может включать / отключать разъем для наушников с помощью контактов.
Например,
Чтобы включить разъем для наушников, используйте:
Чтобы отключить разъем для наушников, используйте:
Поскольку вы просто хотите проверить его состояние, возможно, вы можете использовать какой-либо механизм опроса в вашей java-программе, который может проверять состояние вышеупомянутых пинов с помощью hda. Для этого ваша java-программа должна иметь возможность вызывать hda-verb. Кроме того, вы можете проверить источник hda-глагола, как он доступен, и посмотреть, как они это сделали.
источник
Мой ноутбук оснащен аудиосистемой Conexant Intel HDA, но регуляторы громкости микрофона и наушников никогда не отображаются во многих доступных микшерах, даже в микшере. Динамики микрофона и наушников можно только включить или выключить. Вот крошечный скрипт для этого:
источник