Hem ALSA hem de pulseaudio için çalışan süslü bir dikey bildirim OSD'si var mı?


15

Ses bildirim OSD'sinin hem pulseaudio hem de ALSA ile çalışmasını sağlamanın süslü bir yolu var mı? Şu anda standart masaüstü bilgisayarlar sadece benim için pulseaudio ile çalışıyor. Yedek olarak bir damla olarak kullanabileceğim veya komut satırından rastgele yüzdelerde değişiklikleri grafiksel olarak yukarı ve aşağı hareket eden bir çubuk olarak bildirmek için kullanabileceğim dikey bir OSD'ye ne dersiniz?

Hem ALSA hem de pulseaudio ile çalışmak için ihtiyacımın nedeni, nabızla iyi oynamamış bir WINE uygulaması kullanıyorum, bu yüzden ekstra soyutlama katmanı olmadan ALSA'yı kullanmak için Windows uygulamasını başlatmadan önce nabzı öldürüyorum. Klavyemdeki ses tuşlarının nabızsız çalışmadığını fark ettiğimde, çıkış sinyalini yakalamak için Compiz veya Openbox (sırasıyla CCSM ve lxde-rc.xml ile yapılandırılmış) ile aradığım bazı bash komut dosyaları yazdım pulseaudio --checkve daha sonra ses seviyesini buna göre ayarlayın:

vol_step_up

#!/bin/bash
pulseaudio --check
if [ $? -eq 0 ] ; then
        pactl set-sink-volume 0 -- +3db
    else
        amixer -c0 set Master playback 3+
fi

vol_step_down

#!/bin/bash
pulseaudio --check
if [ $? -eq 0 ] ; then
        pactl set-sink-volume 0 -- -3db
    else
        amixer -c0 set Master playback 3-
fi

Komut dosyaları harika çalışıyor ve düğmelere gayet iyi uyuyor, ancak artık görsel geri bildirimleri görmek için iyi bir yolum yok - düğme olaylarını (XF86AudioLowerVolume, vb.) Yakaladığım için pulseaudio olanlarla bile değil. Açıkçası ALSA ses seviyesi tuşlarını başka bir şeye eşleyebilirim, ancak kısayol tuşlarını çoğaltmanın bir anlamı yok.

Yukarıdaki komut dosyalarında arayabileceğim bir python ses düzeyi denetimi buldum:
https://github.com/fishman/utils/blob/master/pvol.py

pvol.py -s hem ALSA hem de pulseaudio için ekranda geçerli ses seviyesini gösterir, ancak kullandığım gnome OSD'ye kıyasla çok küçük ve dikey değil (üstte çubuk, altta eski OSD):

Standart OSD ve pvol.py boyut karşılaştırması

Böylece, daha büyük yaptım ve etrafa fırlattım:

resim açıklamasını buraya girin

Ancak, yönlendirmeyi dikey olarak değiştirirken bile, mavi varsayılan GTK teması VLC kadar kaygan değildir (aşağıya bakın).

OSD uygulamalarını ararken bulduğum şeylerin çoğu, ilerleme çubuğu konseptinden yoksun olan bildir-gönder komutlarıyla ilgili gönderilerdir. Aksi takdirde, çoğunlukla yatay çubuklardır (ve bash komut dosyalarında çok sayıda sayma yer tutucusu). Gerçekten tek yapmam gereken, amix & pactl'i aramak, bu yüzden pvol.py'deki gtk ilerleme çubuğu gibi basit bir şey harika olurdu - sadece mavi değil ve ekranın tam ortasında değil.

VLC, fare tekerleğini tam ekran modunda kaydırdığınızda aklımdakilere iyi bir örnektir:

VLC Dikey Hacim Çubuğu

Ekranın ortasına oturan normal kutulardan çok daha az engelleyici:

Yatay OSD Hacim Bildirimi

Tüm yatay kaydırıcı benzetmesi, sol ve sağ hoparlörler arasındaki sesi kaydırmanın dışında bana hiç mantıklı gelmedi.

Her neyse, varsayılan masaüstü bildirimlerinin nasıl çağrılacağı (özellikle LXDE)? Tuşa basma olaylarını yapılandırma hakkında pek çok gönderi görüyorum, ancak bu olayların tetiklediği komut dosyalarında pek fazla şey görmüyorum. Dikey fantezi bölümünde başka hangi seçenekler var?

Ayrıca, komut dosyaları ve compiz veya openbox komutları aracılığıyla yürüttüğüm olaylar arasında çakışmaların oluşmasını önlemek için kaldırmam gereken bazı paketler var mı?

Güncelleme: Şu anda hangi OSD'yi kullandığımı anlamak için, sessiz düğmesini hemen kullanma şeklimi değiştirmedim. Xfce4-notifyd'i öldürmek ve daha sonra sessiz düğmesine basmak yeni bir xfce4-notifyd işlemini ortaya çıkarır, bu yüzden büyük hoparlör simgesinin xfce4-volumed gibi bir şeyden geldiğini tahmin ediyordum, ama aslında bu paketin yüklü değil ... Ah ha! Gnome-settings-daemon'u öldürmek ekranın ortasındaki büyük OSD'yi durdurur.


1
NOT: LXDE ile, pulseaudio'yu durdurduğunuzda paneli öldürmeniz ve yeniden doğmanız gerekir, aksi takdirde lxpanel CPU'yu yemeye başlar.
Adam

5
Vay be ne harika ve iyi düşünülmüş bir soru! +1
Seth

Yanıtlar:


10

Tamam, kendi sorumu cevaplama riski altında, yukarıdaki sorudaki bağlantıdan pvol'un birlikte hacklenmiş bir pyqt versiyonunu buldum. Başka bir şey yoksa, belki başka biri kodumu geliştirebilir. Sonunda, ya senaryodaki kullanılmayan kısımlardan kurtulmayı ya da bash scriptlerini denklemin dışına çıkarmayı ve tüm düğme olaylarını işlemek için bir pyqt script'i kullanmayı planlıyorum. Şu anda, OSD son düğmeye basıldıktan sonra sabit bir süre kalmak yerine ilk düğmeye basıldığında sabit bir hızda zaman aşımına uğruyor.

Dosyaları kopyalayın, yapıştırın ve kaydedin (adları kalın harflerle belirtin), hepsini aynı dizine koyun, yürütülebilir bitleri ayarlayın ve pyqt komut dosyasındaki sistem çağrılarını kaydettiğiniz her yere göre değiştirin veya dizinine gidin. Ardından kabuk komut dosyalarını Compiz komutları, Openbox kısayolları veya benzer bir şeyle eşleştirin ve multimedya klavye ses düzeyi düğmeleri kullanmıyorsanız pyqt komut dosyasını değiştirin.

Not: Qvol sınıf adı çalışan bir unvandı ve bunu değiştirmek için uğraşmadım. Sessiz düğmesinin işlenmediğini lütfen unutmayın - Bu yalnızca istenen özellikleri yerine getirmek için olası bir yolu ifade eden bir prototiptir ve şu anda herhangi bir barındırılan proje veya standart geliştirme modeliyle ilişkili değildir. Aşağıdaki koddan türetilen her türlü önemli gelişme muhtemelen Sourceforge, GitHub veya bir proje web sitesine ait olmalıdır. Bununla birlikte, bu cevabı düzenlemekten veya işlev ve tasarımda benzer olan mevcut bir projeyi önermekten çekinmeyin.

pqvol

vol_step_down

#!/bin/bash
pulseaudio --check
#if [ $? -ne 0 ] ; then
if [ $? -eq 0 ] ; then
        pactl set-sink-volume 0 -- -3db
    else
        amixer -c0 set Master playback 3-
fi

if [ -z "$1" ] ; then
        pqvol -s
fi

vol_step_up

#!/bin/bash
pulseaudio --check
#if [ $? -ne 0 ] ; then
if [ $? -eq 0 ] ; then
        pactl set-sink-volume 0 -- +3db
    else
        amixer -c0 set Master playback 3+
fi

if [ -z "$1" ] ; then
    pqvol -s
fi

pqvol

#!/usr/bin/env python2

# pvol -- Commandline audio volume utility
#         with an optional GTK progressbar
# Copyright (C) 2009 Adrian C. <anrxc_sysphere_org>
# Modified by 2011 Reza Jelveh
# Ported to pyqt and renamed to pqvol 2013 by Adam R.

# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.


import os.path
import optparse
import alsaaudio
import sys
from PyQt4 import QtGui, QtCore
from PyQt4.QtCore import QTimer

appname = "Qvol"
#appicon = "/usr/share/icons/ubuntu-mono-light/status/24/audio-volume-high-panel.svg"

DEFAULT_STYLE = """
QProgressBar{
    border: 2px solid grey;
    border-radius: 5px;
    background-color: transparent;
}

QProgressBar::chunk {
    background-color: Gainsboro;
}
"""

class AlsaMixer():
    def __init__(self, pcm=False, mute=False, arg=None):
        self.mixer = alsaaudio.Mixer()
        self.percent = self.mixer.getvolume()[0]
        print self.percent
        self.label = "dB" #% name
        if arg:
            self.percent = min(100, max(0, self.percent + int(arg)))
            self.mixer.setvolume(self.percent)
        if mute:
            mutestate = self.mixer.getmute()[0]
            if mutestate:
                self.label = "Unmuted: "
            else:
                self.label = "Muted: "

            self.mixer.setmute(mutestate^1)
 #     self.label = self.label + "%.0f%%" % self.percent

class Qvol(QtGui.QWidget):

    def __init__(self):
        super(Qvol, self).__init__()
#       self.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint)
        self.setWindowFlags(QtCore.Qt.FramelessWindowHint)
        self.setWindowFlags(QtCore.Qt.Popup)
        self.setAttribute(QtCore.Qt.WA_TranslucentBackground)
        self.setWindowTitle("Qvol")
        self.initUI()

    def initUI(self):     

        self.pbar = QtGui.QProgressBar(self)
        self.pbar.setGeometry(5, 5, 20, 470)
        self.pbar.setOrientation(QtCore.Qt.Vertical)
        self.pbar.setRange(0,100)
        volume = AlsaMixer()
        self.pbar.setValue(volume.percent)
        self.pbar.setTextVisible(False)
        self.setStyleSheet(DEFAULT_STYLE)

        self.setGeometry(1260, 180, 30, 480)
        self.setWindowTitle('QtGui.QProgressBar')
        self.show()


        QTimer.singleShot(2000, finished)

    def keyPressEvent(self, event):
        if event.key()==QtCore.Qt.Key_VolumeMute:
#           QtGui.QWidget.paintEvent()
            finished()
        elif event.key()==QtCore.Qt.Key_VolumeDown:
            launch_process ("vol_step_down silent")
            volume=AlsaMixer()
            self.pbar.setValue(volume.percent)
#           finished()
        elif event.key()==QtCore.Qt.Key_VolumeUp:
            launch_process ("vol_step_up silent")
            volume=AlsaMixer()
            self.pbar.setValue(volume.percent)
#           finished()

#       else:
#           QtGui.QWidget.keyPressEvent(self, event)


processes = set([])

def launch_process(process):
    # Do something asynchronously
    proc = QtCore.QProcess()
    processes.add(proc)
    proc.start(process)
    proc.waitForFinished(-1)

def finished():
    print "The process is done!"
    # Quit the app
    QtCore.QCoreApplication.instance().quit()


def main():

    app = QtGui.QApplication(sys.argv)
    ex = Qvol()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()  

Volume step bash betikleri için "sessiz" argümanlar kukla bir hack'tir - Betikler, argümanla gerçekten var olup olmadığını test etmek dışında hiçbir şey yapmaz. Böylece oraya aynı efektle herhangi bir şey ekleyebilirsiniz.
Adam
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.