web-dev-qa-db-ja.com

ヘッドホン/スピーカーが接続されているかどうかを確認する方法

オーディオ出力を生成するスクリプトを実行していますが、ヘッドフォンがノートブックに接続されているかどうかに応じて、異なる音量レベルを設定したいと思います。

私のスクリプトはすでにさまざまな音量レベルを設定しており、オーディオ出力に何かが接続されている場合、それはヘッドフォンであることを知っています。また、スクリプトの実行時にプラグ/アンプラグの状態が変化しないことも確実です。したがって、スクリプトの開始時に何かが接続されているかどうかを知る必要があるだけです。

Debianテストを実行していて、カーネルにCONFIG_SND_HDA_INPUT_JACKがありませんが、このメソッドはすべての* nixで機能することが望ましいです。

1
hoijui

おそらく短いスクリプトがすべてのカードに釣り込まれます。

#!/bin/sh
# You can put the function below into /etc/profile.d/99-headset.sh
#
has_headset(){
  grep -A4 -ri 'Headphone Playback Switch' /proc/asound/card*/* | \
    grep "Amp-Out vals.*0x00 0x00" -q
}

has_headset

1
Roberto Polli

これはDebianバスターで私にとってはうまくいきますが、snd_card_num値を調整する必要があるかもしれません。ほとんどの場合、0または1である必要があります。おそらく、必要な値を見つける最も簡単な方法は、0から上に向かって試すことです。私にとっては1です。

@dirktで述べたように、node_numも調整する必要がある場合があります。

シェルスクリプトcheckHeadphones

#!/bin/sh
# Check whether the headphones (or speakers) are plugged in or not.
# Usage:
#   checkHeadphones > /dev/null
#   if [ $? -eq 0 ]; then
#     echo "Headphones are connected"
#   else
#     echo "Headphones are not connected"
#   fi

snd_card_num=0
node_num="0x16"
snd_card_file="/proc/asound/card${snd_card_num}/codec#0"

# Run the check
cat "${snd_card_file}" \
    | grep -A 4 'Node $node_num' \
    | grep 'Amp-Out vals:  \[0x00 0x00\]' \
    > /dev/null

exit_state=$?

if [ $exit_state -eq 0 ]; then
    state="connected"
else
    state="disconnected"
fi

echo "$state"
exit $exit_state
1
hoijui