Как приостановить воспроизведение VLC, когда наушники отключены?

12

Как можно приостановить воспроизведение VLC, когда мои наушники подключены? Я могу отключить звук через ALSA, но я хочу использовать пусковой курок, чтобы остановить воспроизведение, как это обычно бывает в смартфонах.

HerHde
источник
1
Обратите внимание: второй ответ гораздо эффективнее на момент написания: 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 одновременно. Я полагаю, что в этом случае может случиться так, что этот подход случайным образом остановит и возобновит один из них (или он может просто не работать).

Большое спасибо @int_ua и @Sneetsher за предоставленную мне важную информацию об обработке событий ACPI. Также спасибо @ user3073656 за упрощение процедуры.

Трюки
источник
1
чтобы выполнить любую команду, для которой требуется DBUS, необходимо экспортировать переменную среды запущенного сеанса dbus. См. Комментарий Джермара об ответе Снишера.
daltonfury42
1
Хорошо подмечено. Вот самый чистый способ, которым я мог придумать, чтобы сделать это. Нет необходимости в автозапуске скриптов и еще много чего.
Трюки
@Stunts, это лучший подход, который я видел, чтобы получить целевой ENV. Можно получить пользователя таким же образом, grep -z USER /proc/$_pid/environчтобы он работал для всех пользователей на машине (с одним запущенным сеансом / vlc). Я искал такой вариант.
user.dz
@Sneetsher: Сладкий! Выглядит намного лучше сейчас. Это пришло мне в голову прошлой ночью, но я слишком устал прошлой ночью, чтобы думать об этом ясно. Спасибо за толчок в этом направлении.
Трюки
1
Вы все еще можете улучшить ответ, используя% e и используя только один файл сценария. Смотрите это .
daltonfury42
9

Итак, вам нужно сделать несколько вещей для этого:

  1. Определить, когда наушники отключены;
  2. После события в (1) отправьте команду «пауза» в VLC;
  3. Определите, когда наушники снова подключены;
  4. После события в (3) отправьте команду «play» в VLC;

Для (1) и (3): Вы можете использовать то, что показано здесь . Этот ответ содержит небольшую процедуру, чтобы найти разницу между подключенным и отключенным разъемом, и сценарий, который вы можете изменить в соответствии со своим случаем.

Для (2) и (4): Вы должны использовать интерфейс Dbus VLC. Соответствующий код должен быть таким:

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в конце, что составляет четверть секунды задержки. Это облегчает работу процессора и все еще работает достаточно быстро. Я тоже иногда использую это в своих сценариях
Сергей Колодяжный
2
ACPI обрабатывает отключение наушников, добавите ли вы это в свой ответ? askubuntu.com/a/642404/20275
int_ua
Потрясающие! Я поработаю над этим сегодня вечером.
Трюки