วิธีการหยุดการเล่น VLC ชั่วคราวเมื่อหูฟังถูกตัดการเชื่อมต่อ?


12

เป็นไปได้อย่างไรที่จะหยุดการเล่น VLC ชั่วคราวเมื่อเสียบหูฟังของฉัน ฉันสามารถปิดเสียงลำโพงผ่าน ALSA แต่ฉันต้องการใช้ทริกเกอร์ปลั๊กเพื่อหยุดการเล่นเนื่องจากเป็นเรื่องปกติในสมาร์ทโฟน


1
แจ้งให้ทราบล่วงหน้า
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ด้วย text editor ที่คุณชื่นชอบ):

    sudo vim /etc/acpi/events/headphones
    

    และเพิ่มรายการต่อไปนี้:

    event=jack/headphone
    action=/etc/acpi/headphone_jack.sh %e
    
  3. ในที่สุดรีสตาร์ท ACPI daemon:

    sudo service acpid restart
    

ฉันคิดว่าควรเป็นสิ่งที่คุณต้องการอย่างแท้จริงโดยไม่เกี่ยวข้องกับการสำรวจ ข้อเสียเปรียบเพียงอย่างเดียวที่ฉันพบได้จากการใช้งานนี้คือในกรณีที่คุณมีผู้ใช้หลายคนที่ใช้งาน VLC ในเวลาเดียวกัน ฉันคิดว่าในกรณีนี้สิ่งที่สามารถเกิดขึ้นได้คือวิธีการนี้จะหยุดชั่วคราวและดำเนินการอย่างใดอย่างหนึ่งต่อ (หรืออาจไม่ทำงาน)

Big Kudos ถึง @int_ua และ @Sneetsher ที่ให้ความรู้ที่สำคัญเกี่ยวกับการจัดการกิจกรรม ACPI ให้ฉัน และยกนิ้วให้กับ @ user3073656 ที่ช่วยให้ขั้นตอนง่ายขึ้น


1
ในการรันคำสั่งใด ๆ ที่ต้องการ DBUS คุณจะต้องส่งออกตัวแปรสภาพแวดล้อมของเซสชัน dbus ที่กำลังทำงานอยู่ ดูความคิดเห็นของ Germar ต่อคำตอบของ Sneetsher
daltonfury42

1
เห็นดี นี่คือวิธีที่สะอาดที่สุดที่ฉันคิดได้ ไม่จำเป็นต้องใช้สคริปต์เริ่มอัตโนมัติและอะไรก็ตาม
ต้องเลิก

@ สตันนั่นเป็นวิธีที่ดีที่สุดที่ฉันเคยเห็นเพื่อให้ได้เป้าหมาย ENV เป็นไปได้ที่จะได้รับผู้ใช้ในลักษณะเดียวกันgrep -z USER /proc/$_pid/environดังนั้นจึงสามารถใช้งานได้กับผู้ใช้ทุกคนในเครื่อง ฉันกำลังมองหาตัวเลือกดังกล่าว
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
คุณสามารถเพิ่ม a sleep 0.25ในตอนท้ายซึ่งเป็นหนึ่งในสี่ของความล่าช้าที่สอง ที่ทำให้ซีพียูลดลงและยังทำงานได้เร็วพอ บางครั้งฉันก็ใช้มันในสคริปต์ของตัวเองเช่นกัน
Sergiy Kolodyazhnyy

2
ACPI จัดการถอดปลั๊กหูฟังคุณจะเพิ่มสิ่งนี้ในคำตอบของคุณหรือไม่? askubuntu.com/a/642404/20275
int_ua

! น่ากลัว ฉันจะทำงานกับมันคืนนี้
ต้องเลิก
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.