Виявлення підключення / відключення навушників у Linux


30

Я намагаюся виявити сигнал, коли навушники підключені або відключені від системи. Який найкращий спосіб зробити це?

Якщо є спеціальна дошка з драйверами, це буде моїм кращим способом.


Я не впевнений, що розумію останню частину - чи маєте ви це зробити, підключивши додатковий апарат до комп'ютера?
rozcietrzewiacz

@rozcietrzewiacz - У мене є програма java, про яку потрібно отримувати сповіщення, якщо навушники підключені чи відключені від мережі. Це моя мета. Я відкритий для будь-яких пропозицій / рекомендацій з використанням або без використання додаткового обладнання.
user775633

@Gilles - Ні, типове обладнання не повідомляє програмне забезпечення. Я знаю, що це U&L, але ви, мабуть, знайомі з класичним набридливим сповіщенням Windows: "Ви підключили пристрій до аудіороз'єму!" i51.tinypic.com/2w2hogw.jpg . Linux, на щастя, цього не робить, але інформація повинна бути доступною з обладнання, яке ви маєте. Питання в тому, як ОС робить цю інформацію доступною.
Кевін Вермер

@KevinVermeer Я, звичайно, не знайомий з цим особливим роздратуванням Windows, ні. Приємно знати, що сучасне обладнання забезпечує повідомлення, дякую. Linux, як правило, надає інформацію до /sysцього часу, і, можливо, сповіщення через dbus.
Жил "ТАК - перестань бути злим"

Це не в системі Windows. Це питання для LINUX os. Я повинен був бути більш чітким. Вибачте! У будь-якому випадку це виглядає як за замовчуванням, немає простого способу затримати це повідомлення. Ось чому я навіть замислююся про те, чи є якісь спеціальні картки, які мають драйвер, який буде захоплювати та робити цей сигнал доступним для додатків, що працюють на Linux.
user775633

Відповіді:


17

У моєму Linux (Debian GNU / Linux 3.12.0 x86_64) це знає система acpi, тому дзвінки acpi_listenпоказують:

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

це, здається, залежить від обраного параметра в конфігурації ядра CONFIG_SND_HDA_INPUT_JACK

Якщо це ваш випадок, ви можете заповнити /etc/acpi/events/сценарії, щоб запустити все, що завгодно.

Перегляньте сторінку http://id.dll.net/man/8/acpid


Це прекрасно працює на моїй системі Ubuntu 15.10 з HDA Intel PCH, ALC892 Analog, як повідомляє Alsa. CONFIG_SND_HDA_INPUT_JACK = y встановлено.
кевінф

14

Ця інформація доступна в /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, щоб перевірити, чи файл був змінений, та отримати інформацію.

Дивіться також https://askubuntu.com/questions/133809/mute-sound-on-headphone-unplug .


1
man inotifyкаже, що псевдо-fs, як / proc, не підлягають моніторингу з inotify. чи існує рішення?
Bibek_G

@Bibek_G так, використовуй acpi_listen(див. Відповідь теїста ).
Дон Хетч

Мені довелося використовувати audio1замість audio0цього для роботи, хоча у мене просто простий зошит із єдиною звуковою карткою. так що це /proc/asound/card1/codec#0для мене, це може бути ще одним номером для вас.
hoijui

3

Знайдіть тег удев джека в Системі, підключіть клієнт (dbus-монітор), який контролює шину, використовуючи DBus для повідомлень про підключення та відключення гнізда.


2

Якщо у вашому ядрі налаштовані входи для гнізда 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

Інструмент під назвою hda-verb може вмикати / вимикати роз'єм для навушників за допомогою штифтів.

Наприклад,

Щоб увімкнути роз'єм для навушників, використовуйте:

./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-verb. Крім того, ви можете перевірити джерело hda-verb, як воно є, і подивитися, як вони це зробили.


0

Мій ноутбук має аудіосистему 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.