Kulaklıklar çıkarıldığında VLC çalmayı nasıl duraklatabilirim?


12

Kulaklığım takılı olduğunda VLC'nin çalınmasını duraklatmak nasıl mümkün olur? Hoparlörleri ALSA üzerinden sessize alabilirim, ancak çalmayı durdurmak için akıllı telefonlarda olduğu gibi fiş tetiği kullanmak istiyorum.


1
Uyarı: İkinci cevap yazma sırasında çok daha etkilidir: askubuntu.com/a/642898/20275
int_ua

Yanıtlar:


5

Tamam, buradan öğrendiklerime dayanarak, ACPI kullanarak yeni bir yaklaşım deniyorum.

  1. VLC'yi duraklatmak ve duraklatmak için bir komut dosyası oluşturun:

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

    ve bu dosyaya aşağıdakileri yerleştirin:

    _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. Şimdi bir etkinlik tetikleyicisi oluşturalım ( vimen sevdiğiniz metin düzenleyicisiyle değiştirin ):

    sudo vim /etc/acpi/events/headphones
    

    ve aşağıdakileri ekleyin:

    event=jack/headphone
    action=/etc/acpi/headphone_jack.sh %e
    
  3. Son olarak, ACPI arka plan programını yeniden başlatın:

    sudo service acpid restart
    

Ben hiçbir anket dahil olmadan tam olarak ne istediğinizi düşünüyorum. Bu uygulama ile bulabildiğim tek dezavantajı, aynı anda VLC çalıştıran birden fazla kullanıcı olması durumundadır. Sanırım bu durumda, bu yaklaşım bunlardan birini rastgele duraklatacak ve devam ettirecektir (veya işe yaramayabilir).

@İnt_ua ve @Sneetsher için Big Kudos, ACPI olay işleme hakkında bana önemli bilgiler verdi. Ayrıca prosedürü basitleştirmeye yardımcı olmak için @ user3073656'ya kadar başparmak alın.


1
DBUS gerektiren herhangi bir komutu çalıştırmak için, çalışan dbus oturumunun ortam değişkenini dışa aktarmanız gerekir. Germar'ın Sneetsher'ın cevabı hakkındaki yorumuna bakın.
daltonfury42

1
İyi gördüm. İşte bunu yapmanın en temiz yolu. Otomatik başlatma komut dosyalarına gerek yoktur.
Dublörler

Stunts, hedef ENV'yi elde etmek için gördüğüm en iyi yaklaşım. Kullanıcıyı aynı şekilde elde etmek mümkündür, grep -z USER /proc/$_pid/environböylece makinedeki tüm kullanıcılar için çalışır (tek çalışan oturum / vlc ile). Böyle bir seçenek arıyordum.
user.dz

@Sneetsher: Tatlı! Şimdi çok daha iyi görünüyor. Dün gece aklımdan geçti, ama dün gece bunu açıkça düşünmek için çok yorgundum. Bu yöndeki itme için teşekkürler.
Dublörler

1
% E kullanarak ve yalnızca tek bir komut dosyası kullanarak yanıtı geliştirebilirsiniz. Bkz bu .
daltonfury42

9

Tamam, bunun için birkaç şey yapmanız gerekecek:

  1. Kulaklıkların çıkarıldığını tespit edin;
  2. (1) 'deki olaydan sonra VLC'ye bir "duraklatma" komutu gönderin;
  3. Kulaklıkların ne zaman takıldığını tespit edin;
  4. (3) 'deki olaydan sonra VLC'ye bir "play" komutu gönderin;

(1) ve (3) için: Burada gösterilenleri kullanabilirsiniz . Bu yanıt, takılı ve çıkarılmamış bir jak arasındaki farkı bulmak için küçük bir yordam ile durumunuza uyacak şekilde değiştirebileceğiniz bir komut dosyası içerir.

(2) ve (4) için: VLC'nin Dbus arayüzünü kullanmalısınız. İlgili kod şu olmalıdır:

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

Sırasıyla duraklatma ve oynatma için.

Şimdi senaryo hakkında. Sizin durumunuzda şöyle görünmelidir:

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

Bu değiştirilmiş komut dosyasını başlangıç ​​uygulamalarınıza ekleyin, hazırsınız. Bence istediğini yapmalı.

Not - inotifyOlay değişikliklerini (ve belki de başka yaklaşımları) tespit etmek için kullanmak gibi bunu yapmanın daha etkili yollarının olduğunu unutmayın , ancak bu sizi başlatmalıdır (ve diğerleri beceri seviyemin ve deneyimimin üstünde). Sanırım bu "hackish" yaklaşımı ile başlayabilir ve buradan kurabilirsiniz.


1
Çok teşekkürler, bu gerçekten yararlı. Daha iyi bir yanıt gönderilmemesi durumunda puanları ödüllendireceğim. Sevmediğim
int_ua

1
Bu soruyu takip edeceğim! Bu bilgiyi kullanabilirdim.
Stunts

3
sleep 0.25Sonuna ikinci bir gecikmenin çeyreği olan a ekleyebilirsiniz . Bu, CPU'da rahatlar ve hala yeterince hızlı çalışır. Bunu bazen kendi
senaryomda

2
ACPI kulaklık fişini çeker, bunu cevabınıza ekler misiniz? askubuntu.com/a/642404/20275
int_ua

Müthiş! Bu gece onunla bir şey çalışacağım.
Stunts
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.