回答:
それでは、ここから学んだことに基づいて、ACPIを使用して新しいアプローチを試みています。
VLCを一時停止および一時停止解除するためのスクリプトを作成します。
sudo touch /etc/acpi/headphone_jack.sh
sudo chmod +x /etc/acpi/headphone_jack.sh
このファイルに次を配置します。
_pid=`pgrep vlc`
_pid="${_pid% *}"
DBUS_SESSION_BUS_ADDRESS=`grep -z DBUS_SESSION_BUS_ADDRESS /proc/$_pid/environ | sed -e 's/DBUS_SESSION_BUS_ADDRESS=//'`
_username=`grep -z USER= /proc/$_pid/environ |sed 's/.*=//'`
if [ "$3" = unplug ]; then
su $_username -c "DBUS_SESSION_BUS_ADDRESS=$DBUS_SESSION_BUS_ADDRESS dbus-send --print-reply --session --dest=org.mpris.MediaPlayer2.vlc /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.Pause"
else
su $_username -c "DBUS_SESSION_BUS_ADDRESS=$DBUS_SESSION_BUS_ADDRESS dbus-send --print-reply --session --dest=org.mpris.MediaPlayer2.vlc /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.Play"
fi
次に、イベントトリガーを作成しましょう(vim
お好みのテキストエディターに置き換えてください)。
sudo vim /etc/acpi/events/headphones
以下を追加します。
event=jack/headphone
action=/etc/acpi/headphone_jack.sh %e
最後に、ACPIデーモンを再起動します。
sudo service acpid restart
ポーリングを行わずに、必要なものを正確に指定する必要があると思います。この実装で見つけることができる唯一の欠点は、複数のユーザーが同時にVLCを実行している場合です。その場合、起こり得ることは、このアプローチがランダムに一時停止して再開することです(または単に機能しない可能性があります)。
ACPIイベント処理に関する重要な知識を提供してくれた@int_uaと@Sneetsherに大きな称賛を送ります。また、手順を簡素化するために@ user3073656に感謝します。
grep -z USER /proc/$_pid/environ
、マシン内のすべてのユーザーで動作します(単一の実行セッション/ vlcで)。私はそのようなオプションを探していました。
わかりましたので、このためにいくつかのことを行う必要があります。
(1)および(3)の場合:ここに示されているものを使用できます。この回答には、接続されているジャックと接続されていないジャックの違いを見つけるための小さな手順と、ケースに合わせて変更できるスクリプトが含まれています。
(2)および(4)の場合:VLCのDbusインターフェイスを使用する必要があります。関連するコードは次のとおりです。
dbus-send --print-reply --session --dest=org.mpris.vlc /Player org.freedesktop.MediaPlayer.Pause
dbus-send --print-reply --session --dest=org.mpris.vlc /Player org.freedesktop.MediaPlayer.Play
それぞれ一時停止と再生用。
さて、スクリプトについて。あなたの場合、次のようになります。
#!/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"
dbus-send --print-reply --session --dest=org.mpris.vlc /Player org.freedesktop.MediaPlayer.Play
oldstatus="$status"
else
echo "Unplugged"
dbus-send --print-reply --session --dest=org.mpris.vlc /Player org.freedesktop.MediaPlayer.Pause
oldstatus="$status"
fi
fi
# Now sleep for 250 milli-seconds as per @Serg's request (who learnt if from @Fabby)
# sleep is timer-based so doesn't use *any* processor cycles while sleeping.
sleep 0.25
done
この変更されたスクリプトをスタートアップアプリケーションに追加すれば、設定は完了です。私はあなたがしたいことをすべきだと思います。
PS- inotify
イベントの変更を検出するために使用するなど、これを行うためのより効率的な方法があることに注意してください(そして、おそらく他のアプローチも)この「ハッキング」アプローチから始めて、ここから構築できると思います。
sleep 0.25
最後にを追加できます。これは1/4秒の遅延です。これにより、CPUの負荷が軽減され、十分に高速に動作します。私も、私自身のスクリプトで、時にはこれを使用