ヘッドセットがシステムに接続または切断されたときに信号を検出しようとしています。これを行う最良の方法は何ですか?
専用ボードとドライバがあれば、それが私が好む方法になります。
答え1
私の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/
スクリプトを入力して必要なものをトリガーできます。
acpid のマニュアルページをご覧ください。http://linux.die.net/man/8/acpid
答え2
この情報はハードウェアによって提供され、/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。
答え3
システムはソケットのudevタグを見つけ、DBusを使用してソケットの接続と切断のメッセージをバスで監視するクライアント(dbus-monitor)を接続します。
答え4
というツールhd動詞ヘッドフォンジャックはピンを使用して有効/無効にできます。
例えば、
ヘッドフォンジャックを有効にするには、次のようにします。
./hda-verb /dev/snd/hwC0D0 0x0f SET_PIN_WIDGET_CONTROL 0x40
ヘッドフォンジャックを無効にするには:
./hda-verb /dev/snd/hwC0D0 0x0f SET_PIN_WIDGET_CONTROL 0
単に状態を確認したいだけなので、hdaを使って上記ピンの状態を確認できるJavaプログラムでいくつかのポーリングメカニズムを使うことができます。これを行うには、Javaプログラムがhda-verbを呼び出すことができる必要があります。あるいは、hda-verbのソース(利用可能なので)を確認し、どのように行ったかを確認することもできます。