Existe um OSD de notificação vertical sofisticado que funciona tanto para ALSA como para pulseaudio?

15

Existe uma maneira sofisticada de fazer com que o OSD de notificação de volume funcione com o pulseaudio e o ALSA? No momento, os desktops padrão só funcionam com pulseaudio para mim. Que tal um OSD vertical que eu possa usar como substituto ou chamada da linha de comando para relatar mudanças em porcentagens arbitrárias graficamente, como uma barra que sobe e desce?

A razão pela qual eu preciso disso para trabalhar com ALSA e pulseaudio é que estou usando um aplicativo WINE que não funciona bem com pulso, então eu mato o pulso antes de iniciar o aplicativo do Windows para usar o ALSA sem o extra camada de abstração. Quando percebi que as teclas de volume no meu teclado não funcionavam sem pulso, escrevi alguns scripts bash que eu chamo com o Compiz ou o Openbox (configurado através do CCSM e lxde-rc.xml, respectivamente) para capturar o sinal de saída de pulseaudio --check e depois ajustar o volume de acordo:

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

Os scripts funcionam muito bem e mapeiam os botões muito bem, mas eu não tenho mais uma boa maneira de ver o feedback visual - nem mesmo com os pulseaudio desde que eu estou pegando os eventos de botão (XF86AudioLowerVolume, etc . Obviamente eu poderia apenas mapear as teclas de volume do ALSA para outra coisa, mas não faz sentido duplicar as teclas de atalho.

Eu encontrei um controle de volume python que eu posso chamar nos scripts acima: link

pvol.py -s mostra o volume atual na tela para ALSA e pulseaudio, mas é muito pequeno se comparado ao gnome OSD que eu estava usando, e não é vertical (barra no topo, antigo OSD na parte inferior):

Então,tornei-omaioretransformei:

Mas, mesmo com a mudança da orientação para uma vertical, o tema GTK padrão azul não é tão bom quanto o VLC (veja abaixo).

Grande parte do que encontrei na pesquisa de implementações de OSD são postagens sobre comandos de envio de notificação que não possuem o conceito de barra de progresso inteiro. Caso contrário, são principalmente barras horizontais (e muitos marcadores de contagem em scripts bash). Realmente tudo que eu preciso fazer é chamar amix & pactl, então algo simples como a barra de progresso do gtk em pvol.py seria ótimo - não tão azul e nem bem no meio da tela.

O VLC tem um bom exemplo do que tenho em mente quando você rola a roda do mouse no modo de tela cheia:

Émuitomenosobstrutivodoqueascaixashabituaisqueficamnocentrodatela:

Toda a analogia do controle deslizante horizontal nunca fez muito sentido para mim fora do panning de áudio entre os alto-falantes esquerdo e direito.

De qualquer forma, como as notificações padrão da área de trabalho são chamadas (especialmente o LXDE)? Vejo muitas postagens sobre a configuração dos principais eventos de imprensa, mas não muito sobre quais scripts esses eventos acionam. Que outras opções estão lá no departamento verticalmente chique?

Além disso, há algum pacote que eu deva desinstalar para evitar conflitos surgindo entre os eventos que estou manipulando por meio de scripts e comandos compiz ou openbox?

Atualização: Para pensar em qual OSD eu estou usando atualmente, eu não mudei a maneira como lidei com o botão mudo imediatamente. Matar xfce4-notifyd e pressionar o botão mudo gera um novo processo xfce4-notifyd, então eu estava supondo que o ícone do grande orador veio de algo como xfce4-volumed, mas eu não tenho esse pacote instalado ... Ah ha! Matar o gnome-settings-daemon pára o grande OSD no centro da tela.

    
por Adam 01.03.2013 / 10:55

1 resposta

10

Tudo bem, correndo o risco de responder a minha própria pergunta, eu criei uma versão pykt de pvol do link na pergunta acima. Se nada mais, talvez alguém possa melhorar meu código. Eventualmente, eu pretendo me livrar das partes no script abaixo, que não são usadas ou tirar os scripts bash da equação e ter um script pyqt para lidar com todos os eventos de botão. No momento, o OSD atinge o tempo limite a partir do primeiro pressionamento do botão, em vez de permanecer ligado por um período fixo após o último pressionamento do botão.

Copie, cole e salve os arquivos (com os nomes em negrito), coloque-os no mesmo diretório, defina os bits executáveis e modifique as chamadas do sistema no script pyqt de acordo com onde quer que você as salve, ou coloque todos eles no diretório que está no seu caminho. Em seguida, mapeie os scripts de shell para comandos do Compiz, atalhos do Openbox ou algo semelhante, e altere o script pyqt se você não estiver usando os botões de volume do teclado multimídia.

Nota: O nome da classe Qvol era um título de trabalho, e eu não me preocupei em mudar isso. Observe também que o botão "mudo" não é manipulado - esse é apenas um protótipo para expressar uma possível avenida para atender aos recursos solicitados e não está atualmente associado a nenhum tipo de projeto hospedado ou modelo de desenvolvimento padrão. Qualquer tipo de desenvolvimento significativo derivado do código abaixo provavelmente deve pertencer ao Sourceforge, GitHub ou a um website do projeto. Dito isso, sinta-se à vontade para editar esta resposta ou sugerir um projeto existente que permita ser semelhante em função e design.

vol_step_down

#!/bin/bashpulseaudio--check#if[$?-ne0];thenif[$?-eq0];thenpactlset-sink-volume0---3dbelseamixer-c0setMasterplayback3-fiif[-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()  
    
por Adam 13.03.2013 / 21:25