断开耳机连接后如何暂停VLC播放?


Answers:


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。我想在这种情况下,可能发生的情况是这种方法将随机暂停并恢复其中之一(或者可能根本行不通)。

@int_ua和@Sneetsher非常感谢您向我提供有关ACPI事件处理的重要知识。还要竖起大拇指@ user3073656来帮助简化过程。


1
要运行任何需要DBUS的命令,您必须导出正在运行的dbus会话的环境变量。请参阅Germar对Sneetsher答案的评论。
daltonfury42 2015年

1
好眼力。这是我想到的最干净的方法。不需要自动启动脚本等等。
特技

@Stunts,这是我看到的获得目标ENV的最佳方法。可能以相同的方式获取用户,grep -z USER /proc/$_pid/environ因此它将对计算机中的所有用户均有效(使用单个运行的会话/ vlc)。我一直在寻找这样的选择。
user.dz 2015年

@Sneetsher:甜!现在看起来好多了。昨晚我想不通,但昨晚我太累了,无法清楚地考虑它。感谢您朝那个方向的努力。
特技

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用于检测事件更改(甚至可能使用其他方法),但是这种方法应该可以帮助您入门(其他方法超出了我的技术水平和经验)。我想您可以从这种“ hackish”方法开始,然后从这里开始。


1
非常感谢,这真的很有帮助。如果没有更好的答案,我会予以奖励。我唯一不喜欢的是持续轮询,为此我创建了一个单独的问题:askubuntu.com/questions/640741/…– int_ua 2015
6

1
我会关注这个问题!我可以利用这些知识。
特技

3
您可以sleep 0.25在末尾添加a ,这是延迟的四分之一秒。这样可以减轻CPU的负担,并且仍然可以足够快地运行。我有时用这个在我自己的脚本,太
谢尔盖Kolodyazhnyy

2
ACPI处理耳机拔出功能,您会将此添加到答案中吗?askubuntu.com/a/642404/20275
int_ua 2015年

太棒了!今晚我将使用它。
特技
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.