Esiste un sofisticato OSD di notifica verticale che funziona sia per ALSA che per pulseaudio?


15

Esiste un modo elegante per far funzionare l'OSD di notifica del volume con pulseaudio e ALSA? In questo momento quelli desktop standard funzionano solo con pulseaudio per me. Che ne dici di un OSD verticale che posso usare come un calo nella sostituzione o chiamare dalla riga di comando per segnalare graficamente le variazioni in percentuali arbitrarie, come una barra che si sposta su e giù?

Il motivo per cui ne ho bisogno per funzionare sia con ALSA che con pulseaudio è che sto usando un'applicazione WINE che non funziona bene con il polso, quindi uccido il polso prima di avviare l'app di Windows per utilizzare ALSA senza il livello di astrazione aggiuntivo. Quando mi sono reso conto che i tasti del volume sulla mia tastiera non funzionavano senza impulsi, ho scritto alcuni script bash che chiamo con Compiz o Openbox (configurati rispettivamente tramite CCSM e lxde-rc.xml) per catturare il segnale di uscita da pulseaudio --checke quindi regolare il volume di conseguenza:

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

Gli script funzionano benissimo e si abbinano perfettamente ai pulsanti, ma non ho più un buon modo di vedere il feedback visivo - nemmeno con quelli pulseaudio poiché sto rilevando gli eventi dei pulsanti (XF86AudioLowerVolume, ecc.). Ovviamente potrei semplicemente mappare i tasti del volume ALSA su qualcos'altro, ma non ha senso duplicare i tasti di scelta rapida.

Ho trovato un controllo del volume Python che posso chiamare negli script sopra:
https://github.com/fishman/utils/blob/master/pvol.py

pvol.py -s mostra l'attuale livello del volume sullo schermo sia per ALSA che per pulseaudio, ma è terribilmente piccolo rispetto allo OSD gnomo che avevo usato e non è verticale (barra in alto, vecchio OSD in basso):

Confronto delle dimensioni di OSD standard e pvol.py

Quindi, l'ho ingrandito e lo ho floppato:

inserisci qui la descrizione dell'immagine

Ma, anche cambiando l'orientamento in verticale, il tema GTK blu predefinito non è così fluido come VLC (vedi sotto).

Gran parte di ciò che ho trovato nella ricerca di implementazioni OSD sono messaggi sui comandi di notifica-invio che mancano dell'intero concetto della barra di avanzamento. Altrimenti, si tratta principalmente di barre orizzontali (e molti contatori di segnaposto negli script bash). Davvero tutto ciò che devo fare è chiamare amix e pactl, quindi qualcosa di semplice come la barra di avanzamento di gtk in pvol.py sarebbe fantastico - solo non così blu e non proprio nel mezzo dello schermo.

VLC ha un buon esempio di ciò che ho in mente quando si fa scorrere la rotellina del mouse in modalità a schermo intero:

Barra del volume verticale VLC

È molto meno ostruttivo rispetto alle solite scatole che si trovano al centro dello schermo:

Notifica volume OSD orizzontale

L'intera analogia dei cursori orizzontali non ha mai avuto molto senso per me al di fuori del panning audio tra i diffusori sinistro e destro.

Ad ogni modo, come mai vengono chiamate le notifiche desktop predefinite (in particolare LXDE)? Vedo molti post sulla configurazione degli eventi di stampa chiave, ma non molto su quali script attivano quegli eventi. Quali altre opzioni ci sono nel reparto di fantasia verticale?

Inoltre, c'è qualche pacchetto che dovrei disinstallare per evitare che sorgano conflitti tra gli eventi che sto gestendo tramite script e comandi compiz o openbox?

Aggiornamento: per capire quale OSD sto attualmente usando, non ho cambiato il modo in cui gestisco il pulsante di disattivazione immediata. Uccidere xfce4-notifyd e quindi premere il pulsante mute genera un nuovo processo xfce4-notifyd, quindi immaginavo che la grande icona dell'altoparlante provenisse da qualcosa come xfce4-volumed, ma in realtà non ho installato quel pacchetto ... Ah ah! Uccidere gnome-settings-daemon arresta il grande OSD al centro dello schermo.


1
NOTA: Con LXDE, è necessario uccidere il pannello e rigenerarlo quando si interrompe pulseaudio o lxpanel inizierà a consumare la CPU.
Adam

5
Caspita che domanda fantastica e ben ponderata! +1
Seth

Risposte:


10

Bene, a rischio di rispondere alla mia stessa domanda, ho trovato un po 'di una versione pyqt di pvol hackerata insieme dal link nella domanda sopra. Se non altro, forse qualcun altro può migliorare il mio codice. Alla fine, ho intenzione di sbarazzarmi delle parti dello script in basso che non vengono utilizzate o di eliminare gli script bash dall'equazione e di avere uno script pyqt in grado di gestire tutti gli eventi dei pulsanti. In questo momento, l'OSD scade a un ritmo costante dalla prima pressione del pulsante invece di rimanere acceso per un periodo di tempo fisso dopo l'ultima pressione del pulsante.

Basta copiare, incollare e salvare i file (con i nomi in grassetto), metterli tutti nella stessa directory, impostare i bit eseguibili e modificare le chiamate di sistema nello script pyqt in base a dove li si salva, oppure inserirli tutti in directory che è nel tuo percorso. Quindi mappare gli script della shell sui comandi Compiz, le scorciatoie di Openbox o qualcosa di simile e modificare lo script pyqt se non si utilizzano i pulsanti del volume della tastiera multimediale.

Nota: il nome della classe Qvol era un titolo funzionante e non mi sono preoccupato di cambiarlo. Si noti inoltre che il pulsante di disattivazione dell'audio non viene gestito: questo è solo un prototipo per esprimere una possibile strada per soddisfare le funzionalità richieste e attualmente non è associato a nessun tipo di progetto ospitato o modello di sviluppo standard. Qualsiasi tipo di sviluppo significativo derivato dal codice seguente dovrebbe probabilmente appartenere a Sourceforge, GitHub o al sito Web di un progetto. Detto questo, sentiti libero di modificare questa risposta o di suggerire un progetto esistente che consenta una funzione e un design simili.

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()  

Gli argomenti "silenziosi" per gli script bash volume step sono una specie di hack fittizio - Gli script in realtà non fanno nulla con l'argomento se non quello di verificare se esiste. Quindi puoi collegare qualsiasi cosa con lo stesso effetto.
Adam
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.