如何检查耳机/扬声器是否已插入

如何检查耳机/扬声器是否已插入

我正在运行一个产生音频输出的脚本,我想根据耳机是否插入我的笔记本电脑来设置不同的音量级别。

我的脚本已经设置了不同的音量级别,并且我知道如果有东西插入音频输出,那就是耳机。还可以肯定的是,在脚本运行期间,插入/拔出状态不会改变。所以我真的只需要知道脚本启动时是否插入了某些东西。

我正在运行 Debian 测试,并且我的内核没有CONFIG_SND_HDA_INPUT_JACK,但最好该方法适用于所有 *nix。

答案1

一个可能更短的脚本探寻所有卡片。

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

答案2

这对我在 Debian buster 上有效,尽管您可能需要调整该snd_card_num值。最有可能的是应该是01。也许找出您需要的值的最简单方法是从 0 向上尝试。对我来说是的1

正如@dirkt 所提到的,您可能还需要调整node_num.

外壳脚本检查耳机

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

相关内容