ヘッドフォンが切断されたときにVLCの再生を一時停止する方法は?


12

ヘッドフォンが接続されていない状態でVLCの再生を一時停止するにはどうすればよいですか?ALSA経由でスピーカーをミュートすることはできますが、スマートフォンでよくあるように、プラグトリガーを使用して再生を停止します。


1
注意:2番目の回答は、執筆時点ではるかに効率的です:askubuntu.com/a/642898/20275
int_ua

回答:


5

それでは、ここから学んだことに基づいて、ACPIを使用して新しいアプローチを試みています。

  1. 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
    
  2. 次に、イベントトリガーを作成しましょう(vimお好みのテキストエディターに置き換えてください)。

    sudo vim /etc/acpi/events/headphones
    

    以下を追加します。

    event=jack/headphone
    action=/etc/acpi/headphone_jack.sh %e
    
  3. 最後に、ACPIデーモンを再起動します。

    sudo service acpid restart
    

ポーリングを行わずに、必要なものを正確に指定する必要があると思います。この実装で見つけることができる唯一の欠点は、複数のユーザーが同時にVLCを実行している場合です。その場合、起こり得ることは、このアプローチがランダムに一時停止して再開することです(または単に機能しない可能性があります)。

ACPIイベント処理に関する重要な知識を提供してくれた@int_uaと@Sneetsherに大きな称賛を送ります。また、手順を簡素化するために@ user3073656に感謝します。


1
DBUSを必要とするコマンドを実行するには、実行中のdbusセッションの環境変数をエクスポートする必要があります。Sneetsherの回答に関するGermarのコメントを参照してください。
-daltonfury42

1
よく見分けられます。これが、私が考えることができる最もクリーンな方法です。自動起動スクリプトなどは必要ありません。
スタント

@Stunts、それはターゲットENVを取得するために私が見た中で最高のアプローチです。ユーザーを同じ方法で取得できるためgrep -z USER /proc/$_pid/environ、マシン内のすべてのユーザーで動作します(単一の実行セッション/ vlcで)。私はそのようなオプションを探していました。
user.dz

@スニーツシャー:甘い!ずっと良くなりました。昨夜は頭をよぎったが、昨夜は疲れすぎてはっきりと考えることができなかった。その方向に押してくれてありがとう。
スタント

1
それでも%eを使用し、単一のスクリプトファイルのみを使用することで、回答を改善できます。参照してくださいこれを
-daltonfury42

9

わかりましたので、このためにいくつかのことを行う必要があります。

  1. ヘッドフォンのプラグが抜かれていることを検出します。
  2. (1)のイベントの後、「一時停止」コマンドをVLCに送信します。
  3. ヘッドフォンが再び接続されたことを検出します。
  4. (3)のイベントの後、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イベントの変更を検出するために使用するなど、これを行うためのより効率的な方法があることに注意してください(そして、おそらく他のアプローチも)この「ハッキング」アプローチから始めて、ここから構築できると思います。


1
どうもありがとう、それは本当に役に立ちます。より良い回答が投稿されない場合は、ポイントに報いる。:私は好きではない唯一の事は、私はそのための個別の質問に作成した、一定のポーリングであるaskubuntu.com/questions/640741/...
int_ua

1
私はその質問に従います!私はその知識を使用できます。
スタント

3
sleep 0.25最後にを追加できます。これは1/4秒の遅延です。これにより、CPUの負荷が軽減され、十分に高速に動作します。私も、私自身のスクリプトで、時にはこれを使用
Sergiy Kolodyazhnyy

2
ACPIはヘッドフォンの取り外しを処理しますが、これを回答に追加しますか?askubuntu.com/a/642404/20275
int_ua

驚くばかり!今夜はそれで何かをするつもりです。
スタント
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.