ヘッドフォンを抜いて(電話のように)音を止めてスピーカーから再生するたびに、コンピューターから音をミュートする方法はありますか?
ヘッドフォンを抜いて(電話のように)音を止めてスピーカーから再生するたびに、コンピューターから音をミュートする方法はありますか?
回答:
基本的に私のために働いたのは:
# When plugged in:
cat /proc/asound/card0/codec#0 > pluggedin.txt
# When not plugged in:
cat /proc/asound/card0/codec#0 > notplugged.txt
# Then compare the differences
diff pluggedin.txt notplugged.txt
私にとっての違いは、「Amp-Out vals」の下の「Node 0x16」にありました。
Node 0x16 [Pin Complex] wcaps 0x40058d: Stereo Amp-Out Node 0x16 [PinComplex] wcaps 0x40058d: Stereo Amp-Out
Amp-Out caps: ofs=0x00, nsteps=0x00, stepsize=0x00, mute=1 Amp-Out caps:ofs=0x00, nsteps=0x00, stepsize=0x00, mute=1
Amp-Out vals: [0x80 0x80] | Amp-Out vals: [0x00 0x00]
そこで、検出された違いに基づいて検出を行いました。
この知識があれば、スクリプトをバックグラウンドで実行できます。プラグを抜くと、スクリプトはamixer sset Master playback 0%
(または他のコマンドを使用して)スピーカーをミュートします。
#!/bin/bash
# This scripts detecs unplugging headphones.
oldstatus="unrelated string"
while [ 1 ]; do
# The following line has to be changed depending on the difference (use diff) in '/proc/asound/card0/code#0'
status=$(grep -A 4 'Node 0x16' '/proc/asound/card0/codec#0' | grep 'Amp-Out vals: \[0x80 0x80\]')
if [ "$status" != "$oldstatus" ]; then
if [ -n "$status" ]; then
echo "Plugged in"
amixer sset Master playback 80% # Set volume to 80%
oldstatus="$status"
else
echo "Unplugged"
amixer sset Master playback 0% # Mute
oldstatus="$status"
fi
fi
done
で実行可能にしchmod +x scriptname.sh
て、スタートアップアプリケーションに配置できます。アンプラグ検出を調整する必要があります/proc/asound/card0/codec#0
(ただし、複数のサウンドカードの場合は、ここで数値を変更することもできます)。
関連リンク:
https://wiki.ubuntu.com/Audio/PreciseJackDetectionTesting
/unix/25776/detecting-headphone-connection-disconnection-in-linux
while
バックグラウンドで継続的に実行される無限ループ(少しのスリープ命令もなし)を含むスクリプトを持つことは、理想的なソリューションとはほど遠いものです。これは、CPUとバッテリーキラーであることに加えて、醜くハックな回避策です。私はそれを試して、5%の一定のCPU使用率(ブラウザー、spotify、ターミナル、IDE、テレグラム、およびその他のアプリを開いた状態)の通常の状況から、45%の一定のCPU使用率に移行しました。
acpi_listen
、この回答のリンクの1つで提案されているように、を使用してください。
ubuntu-16.10の場合、この回答にはほとんど変更を加えていません。
oldresult="Some Random String"
while [ 1 ]; do
# incase of plugged out result will contain some data
result=$(grep "EAPD 0x2: EAPD" /proc/asound/card0/codec#0)
# checking for oldresult if not same then only go inside
if [ "$oldresult" != "$result" ]; then
oldresult=$result
if [[ -z "$result" ]]; then
notify-send "Plugged In"
amixer sset Master playback 80% # Set volume to 80%
else
notify-send "Plugged Out"
amixer sset Master playback 0% # Set volume to 0%
fi
fi
done