Linux'ta kulaklık bağlantısı / bağlantısının kesilmesi


30

Bir kulaklık bağlandığında veya sistemden çıkarıldığında bir sinyal algılamaya çalışıyorum. Bunu yapmanın en iyi yolu nedir?

Şoförlü özel bir pano varsa, bu benim tercih ettiğim yol olacak.


Son kısmı anladığımdan emin değilim - bunu bilgisayarınıza ek bir donanım bağlayarak yapmak niyetinde misiniz?
rozcietrzewiacz

@rozcietrzewiacz - Kulaklık fişi takılı veya fişi çekilmiş ise, bildirilmesi gereken bir java uygulamasına sahibim. Bu benim hedefim. Herhangi bir öneri / öneriye ek donanım kullanmadan veya kullanmadan açığım.
user775633

@Gilles - Hayır, tipik donanım yapar yazılıma bildirim sağlarlar. Bunun U&L olduğunu biliyorum, ancak klasik sinir bozucu Windows bildirimini biliyorsunuzdur: "Bir aygıtı ses jakına bağladınız!" i51.tinypic.com/2w2hogw.jpg . Linux, neyse ki, bunu yapmaz, ancak bilgilere sahip olduğunuz donanımdan ulaşılabilir olmalıdır. Soru, işletim sisteminin bu bilgiyi nasıl erişilebilir kıldığıdır.
Kevin Vermeer

@KevinVermeer Bu özel Windows sıkıntısına aşina olmadım, hayır. Modern donanımın bildirim sağladığını bilmek güzel, teşekkür ederim. Linux genellikle /syso zamana kadar bilgileri ve belki de dbus aracılığıyla bildirimleri sağlayacaktır .
Gilles 'SO- kötülük' dur '

Bu bir Windows sisteminde değil. Bu sorun LINUX işletim sistemi içindir. Daha açık olmalıydım. Üzgünüm! Neyse, varsayılan olarak bu bildirimi yakalamak için kolay bir yol yok gibi gözüküyor .. Bu yüzden, linux üzerinde çalışan uygulamalar için bu sinyali yakalayacak ve kullanılabilir kılacak bir sürücüye sahip herhangi bir özel kart olup olmadığına bakmayı bile düşünüyorum.
user775633

Yanıtlar:


17

Benim Linux kullanımında (Debian GNU / Linux 3.12.0 x86_64) bu know acpi sistem tarafından çağıran böyledir acpi_listengösterileri:

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

bu çekirdek config içindeki seçili bir seçeneğe bağlı görünüyor CONFIG_SND_HDA_INPUT_JACK

Bu durumda, istediğiniz herhangi bir /etc/acpi/events/ateşlemek için komut dosyaları ile doldurabilirsiniz .

Acpid man sayfasını kontrol edin http://linux.die.net/man/8/acpid


Bu, Alsa tarafından bildirildiği gibi HDA Intel PCH, ALC892 Analog ile Ubuntu 15.10 sistemimde mükemmel şekilde çalışıyor. CONFIG_SND_HDA_INPUT_JACK = y ayarlandı.
kevinf

14

Bu bilgi /proc/asound/card0/codec#0donanımda bulunur ve donanıma bağlıdır. Bilgisayarım için bu bilgiyi içeren bölümde bulunuyor:

Kulaklık bağlı:

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

Kulaklık bağlantısı kesildi (bkz. 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
[...]

Dosyanın değiştirilip değiştirilmediğini kontrol etmek ve bilgileri elemek için inotify komutunu kullanabilirsiniz.

Ayrıca bkz . Https://askubuntu.com/questions/133809/mute-sound-on-headphone-unplug .


1
man inotify/ proc gibi yalancı fs inotify ile izlenebilir olmadığını söylüyor. bir geçici çözüm var mı?
Bibek_G

@Bibek_G evet, kullan acpi_listen( theist'in cevabına bakınız).
Don Hatch,

Tek bir ses kartına sahip basit bir dizüstü bilgisayarım olmasına rağmen, audio1bunun çalışması audio0için kullanmak zorunda kaldım . bu yüzden /proc/asound/card1/codec#0benim için, henüz sizin için başka bir numara olabilir.
hoijui,

3

Sistemdeki jakın udev etiketleyicisini bulun, jak bağlantı ve bağlantı kesme mesajları için veri yolunu DBus kullanarak izleyen bir istemci bağlayın (dbus-monitor).


2

Çekirdeğinizde jak girişi yapılandırılmışsa root@brix:~# grep CONFIG_SND_HDA_INPUT_JACK /boot/config-$(uname -r)

Kullanarak Evtesttüm giriş olaylarını listeleyebilirsiniz.

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-fiil adı verilen bir araç , kulaklık jakını pimler kullanarak etkinleştirebilir / devre dışı bırakabilir.

Örneğin,

Kulaklık jakını etkinleştirmek için aşağıdakileri kullanın:

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

Kulaklık jakını devre dışı bırakmak için şunu kullanın:

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

Sadece durumunu kontrol etmek istediğinden, belki java programında hda kullanarak yukarıdaki pinlerin durumunu kontrol edebilecek bazı yoklama mekanizmaları kullanabilirsin. Bunun için java programınız hda-fiilini çağırabilir olmalıdır. Alternatif olarak, hda-fiilinin kaynağını kullanılabilir olduğu şekilde kontrol edebilir ve nasıl yaptıklarını görebilirsiniz.


0

Dizüstü bilgisayarımın bir Conexant Intel HDA ses sistemi var, ancak mikrofon ve kulaklık jakı ses seviyesi kontrolleri, alsamiksör de dahil olmak üzere birçok mikserin içinde hiçbir zaman görünmüyor. Mikrofon ve kulaklık hoparlörleri yalnızca AÇIK veya KAPALI duruma getirilebilir. İşte sadece bunu yapmak için küçük bir senaryo:

#!/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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.