헤드폰 연결이 끊어졌을 때 VLC 재생을 일시 중지하는 방법은 무엇입니까?


12

헤드폰이 연결되어 있지 않을 때 VLC 재생을 일시 중지하는 방법은 무엇입니까? ALSA를 통해 스피커를 음소거 할 수 있지만 스마트 폰 에서처럼 플러그 트리거를 사용하여 재생을 중지하고 싶습니다.


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를 실행하는 경우입니다. 이 경우 발생할 수있는 일은이 접근법이 무작위로 일시 중지하고 그 중 하나를 재개 할 것입니다 (또는 단순히 작동하지 않을 수 있음).

ACPI 이벤트 처리에 관한 중요한 지식을 제공 한 @int_ua 및 @Sneetsher에게 큰 도움이되었습니다. 또한 절차를 단순화하기 위해 @ user3073656까지 승인합니다.


1
DBUS가 필요한 명령을 실행하려면 실행중인 dbus 세션의 환경 변수를 내 보내야합니다. Sneetsher의 답변에 대한 Germar의 의견을 참조하십시오.
daltonfury42

1
잘 발견되었습니다. 내가 생각할 수있는 가장 깨끗한 방법은 다음과 같습니다. 자동 시작 스크립트가 필요하지 않습니다.
Stunts

@Stunts, 이것이 목표 ENV를 얻는 가장 좋은 방법입니다. 동일한 방식으로 사용자를 확보 할 수 grep -z USER /proc/$_pid/environ있으므로 시스템의 모든 사용자 (단일 실행 세션 / vlc)에서 작동합니다. 나는 그런 옵션을 찾고있었습니다.
user.dz

@ 스니커 : Sweet! 지금 훨씬 좋아 보인다. 어젯밤 내 마음을 건 crossed지만 어젯밤 너무 지쳐서 명확하게 생각하지 못했습니다. 그 방향으로 밀어 주셔서 감사합니다.
스턴트

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

이 수정 된 스크립트를 시작 응용 프로그램에 추가하면 설정됩니다. 나는 당신이 원하는 것을해야한다고 생각합니다.

추신- inotify이벤트 변경 (그리고 아마도 다른 접근법)을 감지하는 데 사용 하는 것과 같이보다 효율적인 방법이 있지만,이 방법을 시작해야합니다 (다른 기술은 내 기술 수준과 경험 이상입니다). 이 "hackish"접근 방식으로 시작하여 여기에서 구축 할 수 있다고 가정합니다.


1
고마워요, 정말 도움이됩니다. 더 나은 답변이 게시되지 않은 경우 포인트를 보상하겠습니다. 내가 좋아하지 않는 유일한 것은 지속적인 폴링입니다. 이에
int_ua

1
나는 그 질문을 따를 것이다! 나는 그 지식을 사용할 수 있습니다.
스턴트

3
sleep 0.25끝에 2 분의 1 초 지연을 추가 할 수 있습니다 . 그것은 CPU를 완화시키고 여전히 충분히 빠르게 작동합니다. 나도 내 자신의 스크립트에서이 때때로을 사용
세르지 Kolodyazhnyy

2
ACPI가 헤드폰 분리를 처리합니다. 답변에 추가 하시겠습니까? askubuntu.com/a/642404/20275
int_ua

대박! 오늘 밤에 뭔가 할거에요
스턴트
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.