Bagaimana cara menjeda pemutaran VLC ketika headphone terputus?

12

Bagaimana mungkin untuk menghentikan sementara pemutaran VLC ketika headphone saya dicolokkan? Saya dapat membisukan speaker melalui ALSA, tetapi saya ingin menggunakan pemicu colokan untuk menghentikan pemutaran, seperti biasa di smartphone.

HerHde
sumber
1
Perhatikan: jawaban kedua jauh lebih efisien pada saat penulisan: askubuntu.com/a/642898/20275
int_ua

Jawaban:

5

Ok, jadi berdasarkan apa yang saya pelajari dari sini , saya mencoba pendekatan baru, menggunakan ACPI.

  1. Buat skrip, untuk menjeda dan menghapus VLC:

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

    dan letakkan yang berikut di file ini:

    _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. Sekarang mari kita buat pemicu acara (ganti vimdengan editor teks favorit Anda):

    sudo vim /etc/acpi/events/headphones
    

    dan tambahkan yang berikut ini:

    event=jack/headphone
    action=/etc/acpi/headphone_jack.sh %e
    
  3. Terakhir, restart daemon ACPI:

    sudo service acpid restart
    

Saya pikir seharusnya persis apa yang Anda butuhkan, tanpa melibatkan pemungutan suara. Satu-satunya kelemahan yang dapat saya temukan dengan implementasi ini adalah jika Anda memiliki banyak pengguna yang menjalankan VLC pada saat yang sama. Saya kira dalam kasus itu, apa yang bisa terjadi adalah bahwa pendekatan ini akan secara acak berhenti dan melanjutkan salah satunya (atau mungkin tidak berhasil).

Big Kudos to @int_ua dan @Sneetsher untuk memberi saya pengetahuan penting tentang penanganan acara ACPI. Juga jempol ke @ user3073656 untuk membantu menyederhanakan prosedur.

Akrobat
sumber
1
untuk menjalankan perintah apa pun yang membutuhkan DBUS, Anda harus mengekspor variabel lingkungan dari sesi dbus yang berjalan. Lihat komentar Germar tentang jawaban Sneetsher.
daltonfury42
1
Terlihat dengan baik. Inilah cara terbersih yang bisa saya pikirkan untuk melakukan itu. Tidak perlu skrip autostart dan yang lainnya.
Stunts
@Stunts, itulah pendekatan terbaik yang saya lihat untuk mendapatkan target ENV. Dimungkinkan untuk mendapatkan pengguna dengan cara yang sama grep -z USER /proc/$_pid/environsehingga akan bekerja untuk semua pengguna di mesin (dengan sesi berjalan tunggal / vlc). Saya mencari opsi seperti itu.
user.dz
@Sneetsher: Manis! Terlihat jauh lebih baik sekarang. Itu terlintas di benak saya semalam, tetapi saya terlalu lelah tadi malam untuk memikirkannya dengan jelas. Terima kasih atas dorongan ke arah itu.
Stunts
1
Anda masih dapat meningkatkan jawabannya dengan menggunakan% e, dan hanya menggunakan satu file skrip. Lihat ini .
daltonfury42
9

Oke, jadi Anda perlu melakukan beberapa hal untuk ini:

  1. Mendeteksi ketika headphone dicabut;
  2. Setelah kejadian di (1), kirim perintah "pause" ke VLC;
  3. Mendeteksi ketika headphone dipasang kembali;
  4. Setelah acara di (3), kirim perintah "play" ke VLC;

Untuk (1) dan (3): Anda dapat menggunakan apa yang ditunjukkan di sini . Jawaban ini berisi prosedur kecil untuk menemukan perbedaan antara colokan yang dicolokkan dan yang dicabut, dan skrip yang dapat Anda modifikasi agar sesuai dengan kasus Anda.

Untuk (2) dan (4): Anda harus menggunakan antarmuka Dbus VLC. Kode yang relevan harus ini:

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

Untuk jeda dan mainkan masing-masing.

Sekarang, tentang skripnya. Dalam kasus Anda, seharusnya terlihat seperti ini:

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

Tambahkan skrip yang dimodifikasi ini ke aplikasi startup Anda, dan Anda siap. Saya pikir itu harus melakukan apa yang Anda inginkan.

PS - Perhatikan bahwa ada cara yang lebih efisien untuk melakukan ini, seperti menggunakan inotifyuntuk mendeteksi perubahan acara (dan mungkin bahkan pendekatan lain), tetapi yang ini harus Anda mulai (dan yang lain di atas tingkat keterampilan dan pengalaman saya). Saya kira Anda bisa mulai dengan pendekatan "retas" ini, dan membangun dari sini.

Akrobat
sumber
1
Terima kasih banyak, itu sangat membantu. Saya akan menghargai poin jika tidak ada jawaban yang lebih baik diposting. Satu-satunya hal yang saya tidak suka adalah pemungutan suara konstan, saya telah membuat pertanyaan terpisah untuk itu: askubuntu.com/questions/640741/...
int_ua
1
Saya akan mengikuti pertanyaan itu! Saya bisa menggunakan pengetahuan itu.
Stunts
3
Anda bisa menambahkan sleep 0.25di akhir, yang merupakan seperempat dari penundaan kedua. Itu memudahkan CPU dan masih bekerja cukup cepat. Saya kadang-kadang menggunakan ini dalam skrip saya sendiri
Sergiy Kolodyazhnyy
2
ACPI menangani headphone cabut, apakah Anda akan menambahkan ini ke jawaban Anda? askubuntu.com/a/642404/20275
int_ua
Luar biasa! Saya akan mengerjakan sesuatu dengannya malam ini.
Stunts