Mendeteksi koneksi / pemutusan headphone di Linux

30

Saya mencoba mendeteksi sinyal ketika headphone terhubung atau terputus dari sistem. Apa cara terbaik untuk melakukan ini?

Jika ada papan khusus dengan driver, itu akan menjadi cara yang saya sukai.

pengguna775633
sumber
Saya tidak yakin saya mengerti bagian terakhir - apakah Anda bermaksud melakukan ini dengan menghubungkan perangkat keras tambahan ke komputer Anda?
rozcietrzewiacz
@rozcietrzewiacz - Saya memiliki aplikasi java yang perlu diberi tahu jika headphone dicolokkan atau dicabut. Itu tujuan saya. Saya terbuka untuk saran / rekomendasi dengan atau tanpa menggunakan perangkat keras tambahan.
user775633
@Gilles - Tidak, perangkat keras biasa memang memberikan pemberitahuan ke perangkat lunak. Saya tahu ini adalah U&L, tetapi Anda mungkin akrab dengan notifikasi Windows klasik yang menjengkelkan: "Anda telah menyambungkan perangkat ke jack audio!" i51.tinypic.com/2w2hogw.jpg . Untungnya, Linux tidak melakukan ini, tetapi informasinya harus tersedia dari perangkat keras yang Anda punya. Pertanyaannya adalah bagaimana OS membuat informasi ini tersedia.
Kevin Vermeer
@KevinVermeer Saya tidak terbiasa dengan gangguan Windows khusus ini, tidak. Senang mengetahui bahwa perangkat keras modern memang memberikan pemberitahuan, terima kasih. Linux biasanya akan memberikan informasi melalui /sysitu, dan mungkin pemberitahuan melalui dbus.
Gilles 'SANGAT berhenti menjadi jahat'
Ini bukan pada sistem windows. Masalah ini untuk LINUX os. Saya seharusnya lebih eksplisit. Maaf! Lagi pula sepertinya secara default tidak ada cara mudah untuk menjebak pemberitahuan itu .. Itulah sebabnya saya bahkan berpikir untuk melihat keluar jika ada kartu khusus yang memiliki driver yang akan menjebak dan membuat sinyal ini tersedia untuk aplikasi yang berjalan di linux.
user775633

Jawaban:

17

Di linux saya (Debian GNU / Linux 3.12.0 x86_64) ini diketahui oleh sistem acpi sehingga panggilan acpi_listenmenunjukkan:

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

ini tampaknya bergantung pada opsi yang dipilih di konfigurasi kernel CONFIG_SND_HDA_INPUT_JACK

Jika ini adalah kasus Anda, Anda dapat mengisi /etc/acpi/events/dengan skrip untuk memecat apa pun yang Anda inginkan.

Periksa halaman manual acpid http://linux.die.net/man/8/acpid

teis
sumber
Ini bekerja dengan baik pada sistem Ubuntu 15.10 saya dengan HDA Intel PCH, ALC892 Analog, seperti yang dilaporkan oleh Alsa. CONFIG_SND_HDA_INPUT_JACK = y diatur.
kevinf
14

Informasi ini tersedia di /proc/asound/card0/codec#0dan tergantung pada perangkat keras. Untuk komputer saya, ada di bagian yang menangkap informasi ini:

Headphone terhubung:

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

Headphone terputus (lihat 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
[...]

Anda dapat menggunakan inotify untuk memeriksa apakah file telah dimodifikasi dan menerima informasi.

Lihat juga https://askubuntu.com/questions/133809/mute-sound-on-headphone-unplug .

Florian Bw
sumber
1
man inotifymengatakan pseudo-fs seperti / proc tidak dapat dimonitor dengan inotify. apakah ada solusinya?
Bibek_G
@Bibek_G ya, gunakan acpi_listen(lihat jawaban theist ).
Don Hatch
Saya harus menggunakan audio1alih-alih audio0agar ini berfungsi, meskipun saya hanya memiliki notebook sederhana dengan kartu suara tunggal. jadi itu /proc/asound/card1/codec#0untuk saya, mungkin belum nomor lain untuk Anda.
hoijui
3

Temukan tagger udev jack pada Sistem, hubungkan klien (monitor-dbus) yang memantau bus menggunakan DBus untuk pesan-pesan di jack connect & disconnections.

Nikhil Mulley
sumber
2

Jika kernel Anda memiliki input jack yang dikonfigurasi root@brix:~# grep CONFIG_SND_HDA_INPUT_JACK /boot/config-$(uname -r)

Menggunakan EvtestAnda dapat membuat daftar semua acara masukan Anda.

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 ------------
kevinf
sumber
2

Alat yang disebut hda-kata kerja dapat mengaktifkan / menonaktifkan jack headphone menggunakan pin.

Sebagai contoh,

Untuk mengaktifkan jack headphone, gunakan:

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

Untuk menonaktifkan jack headphone, gunakan:

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

Karena Anda hanya ingin memeriksa statusnya, mungkin Anda dapat menggunakan beberapa mekanisme polling di program java Anda yang dapat memeriksa status pin di atas menggunakan hda. Untuk ini, program java Anda harus dapat memanggil hda-kata kerja. Atau, Anda dapat memeriksa sumber kata kerja hda ketika tersedia dan melihat bagaimana mereka melakukannya.

Omar Khan
sumber
0

Laptop saya memiliki sistem audio Intel HDA Conexant, tetapi kontrol volume jack mic dan headphone tidak pernah muncul di dalam banyak mixer yang tersedia, bahkan alsamixer. Speaker mic dan headphone hanya dapat dihidupkan atau dimatikan. Berikut ini skrip kecil untuk melakukannya:

#!/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
rmstock
sumber