Làm cách nào để tạm dừng phát lại VLC khi tai nghe bị ngắt kết nối?


12

Làm thế nào có thể tạm dừng phát lại VLC khi tai nghe của tôi được cắm? Tôi có thể tắt tiếng loa qua ALSA, nhưng tôi muốn sử dụng trình kích hoạt phích cắm để dừng phát lại, như thường thấy trong điện thoại thông minh.


1
Lưu ý: câu trả lời thứ hai hiệu quả hơn nhiều tại thời điểm viết bài: Askubfox.com/a/642898/20275
int_ua

Câu trả lời:


5

Ok, vì vậy dựa trên những gì tôi đã học được từ đây , tôi đang thử một cách tiếp cận mới, sử dụng ACPI.

  1. Tạo một tập lệnh, để tạm dừng và bỏ tạm dừng VLC:

    sudo touch /etc/acpi/headphone_jack.sh
    sudo chmod +x /etc/acpi/headphone_jack.sh
    

    và đặt như sau vào tập tin này:

    _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. Bây giờ, hãy tạo trình kích hoạt sự kiện (thay thế vimbằng trình soạn thảo văn bản yêu thích của bạn):

    sudo vim /etc/acpi/events/headphones
    

    và thêm vào như sau:

    event=jack/headphone
    action=/etc/acpi/headphone_jack.sh %e
    
  3. Cuối cùng, khởi động lại daemon ACPI:

    sudo service acpid restart
    

Tôi nghĩ rằng nên chính xác những gì bạn yêu cầu, không có bỏ phiếu liên quan. Hạn chế duy nhất tôi có thể tìm thấy với việc triển khai này là trong trường hợp bạn có nhiều người dùng chạy VLC cùng một lúc. Tôi cho rằng trong trường hợp đó, điều có thể xảy ra là cách tiếp cận này sẽ ngẫu nhiên tạm dừng và tiếp tục một trong số chúng (hoặc đơn giản là nó không hoạt động).

Big Kudos gửi @int_ua và @Sneetsher vì đã cung cấp cho tôi kiến ​​thức quan trọng về xử lý sự kiện ACPI. Đồng thời đưa ngón tay cái lên tới @ user3073656 để giúp đơn giản hóa thủ tục.


1
để chạy bất kỳ lệnh nào cần DBUS, bạn phải xuất biến môi trường của phiên dbus đang chạy. Xem bình luận của Germar về câu trả lời của Sneetsher.
daltonfury42

1
Cũng phát hiện ra. Đây là cách sạch nhất mà tôi có thể nghĩ ra để làm điều đó. Không cần autostart script và whatnot.
Các pha nguy hiểm

@Stunts, đó là cách tiếp cận tốt nhất tôi từng thấy để có được ENV mục tiêu. Có thể có được người dùng theo cùng một cách grep -z USER /proc/$_pid/environđể nó sẽ hoạt động cho tất cả người dùng trong máy (với phiên chạy / vlc duy nhất). Tôi đã tìm kiếm lựa chọn như vậy.
user.dz

@Sneetsher: Ngọt ngào! Có vẻ tốt hơn nhiều bây giờ. Nó thoáng qua tâm trí tôi đêm qua, nhưng đêm qua tôi đã quá mệt mỏi để nghĩ về nó một cách rõ ràng. Cảm ơn cho sự thúc đẩy theo hướng đó.
Các pha nguy hiểm

1
Bạn vẫn có thể cải thiện câu trả lời bằng cách sử dụng% e và chỉ sử dụng một tệp tập lệnh duy nhất. Xem này .
daltonfury42

9

Ok, vì vậy bạn sẽ cần phải làm một vài điều cho việc này:

  1. Phát hiện khi rút tai nghe;
  2. Sau sự kiện trong (1), gửi lệnh "tạm dừng" đến VLC;
  3. Phát hiện khi tai nghe bị cắm trở lại;
  4. Sau sự kiện trong (3), gửi lệnh "play" tới VLC;

Đối với (1) và (3): Bạn có thể sử dụng những gì được hiển thị ở đây . Câu trả lời này chứa một quy trình nhỏ để tìm sự khác biệt giữa giắc cắm được cắm và rút phích cắm và tập lệnh mà bạn có thể sửa đổi để phù hợp với trường hợp của mình.

Đối với (2) và (4): Bạn nên sử dụng giao diện Dbus của VLC. Mã có liên quan nên là:

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

Để tạm dừng và chơi tương ứng.

Bây giờ, về kịch bản. Trong trường hợp của bạn, nó sẽ trông giống như thế này:

#!/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

Thêm tập lệnh sửa đổi này vào các ứng dụng khởi động của bạn và bạn đã thiết lập. Tôi nghĩ rằng nó nên làm những gì bạn muốn.

Tái bút - Lưu ý rằng có nhiều cách hiệu quả hơn để thực hiện việc này, chẳng hạn như sử dụng inotifyđể phát hiện các thay đổi sự kiện (và thậm chí có thể là các phương pháp khác), nhưng cách này sẽ giúp bạn bắt đầu (và những cách khác ở trên mức độ kỹ năng và kinh nghiệm của tôi). Tôi cho rằng bạn có thể bắt đầu với phương pháp "hackish" này và xây dựng từ đây.


1
Cảm ơn rất nhiều, điều đó thực sự hữu ích. Tôi sẽ thưởng điểm trong trường hợp không có câu trả lời tốt hơn được đăng. Điều duy nhất tôi không thích là việc bỏ phiếu liên tục, tôi đã tạo một câu hỏi riêng cho câu hỏi đó: askubfox.com/questions/640741/ợi
int_ua

1
Tôi sẽ làm theo câu hỏi đó! Tôi có thể sử dụng kiến ​​thức đó.
Các pha nguy hiểm

3
Bạn có thể thêm một sleep 0.25ở cuối, đó là một phần tư của độ trễ thứ hai. Điều đó giúp giảm bớt CPU và vẫn hoạt động đủ nhanh. Đôi khi tôi cũng sử dụng điều này trong các kịch bản của riêng mình
Sergiy Kolodyazhnyy

2
ACPI xử lý rút tai nghe ra, bạn sẽ thêm điều này vào câu trả lời của mình chứ? Askubfox.com/a/642404/20275
int_ua

Tuyệt vời! Tôi sẽ làm việc gì đó với nó tối nay.
Các pha nguy hiểm
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.