헤드폰/스피커가 연결되어 있는지 확인하는 방법

헤드폰/스피커가 연결되어 있는지 확인하는 방법

오디오 출력을 생성하는 스크립트를 실행 중이며 헤드폰이 노트북에 연결되어 있는지 여부에 따라 다른 볼륨 레벨을 설정하고 싶습니다.

내 스크립트는 이미 다양한 볼륨 레벨을 설정했으며 오디오 출력에 무언가가 연결되어 있으면 헤드폰이라는 것을 알고 있습니다. 또한 스크립트가 실행되는 동안 플러그/플러그 해제 상태는 변경되지 않습니다. 따라서 스크립트가 시작될 때 무언가가 삽입되었는지 알아야 합니다.

나는 데비안 테스트를 실행하고 있는데 내 커널은 그렇지 않습니다 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

snd_card_num이 값을 조정해야 할 수도 있지만 이는 데비안 버스터에서 작동합니다 . 대부분은 0또는 이어야 합니다 1. 아마도 필요한 값을 찾는 가장 쉬운 방법은 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

관련 정보