是否有适用于ALSA和Pulseaudio的精美垂直通知OSD?


15

是否有一种理想的方法来使音量通知OSD与Pulseaudio和ALSA一起使用?现在,标准台式机对我而言只能与Pulseaudio一起使用。我可以将垂直OSD用作替换项或从命令行调用以图形方式报告任意百分比的变化(作为上下移动的条形图)吗?

之所以需要它同时与ALSA和Pulseaudio一起使用,是因为我使用的WINE应用程序不能与Pulse很好地配合使用,因此在启动Windows应用程序以使用没有额外抽象层的ALSA之前,我要杀死Pulse。当我意识到键盘上的音量键无法正常工作时,我编写了一些bash脚本,分别用Compiz或Openbox(分别通过CCSM和lxde-rc.xml配置)调用以捕获来自pulseaudio --check和的退出信号。然后相应地调整音量:

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

脚本可以很好地工作并且可以很好地映射到按钮,但是我再也没有看到视觉反馈的好方法了-甚至在使用pulseaudio时也是如此,因为我正在捕获按钮事件(XF86AudioLowerVolume等)。显然,我可以将ALSA音量键映射到其他键,但是复制快捷键没有任何意义。

我确实找到了可以在上面的脚本中调用的python音量控件:https :
//github.com/fishman/utils/blob/master/pvol.py

pvol.py -s 在屏幕上显示ALSA和Pulseaudio的当前音量水平,但是与我一直使用的gnome OSD相比,它的体积很小,并且不是垂直的(顶部是竖条,底部是老OSD):

标准OSD和pvol.py的大小比较

所以,我把它做大了,然后放了一下:

在此处输入图片说明

但是,即使将方向切换为垂直方向,蓝色的默认GTK主题也不会像VLC那样光滑(请参见下文)。

我在搜索OSD实现中发现的很多内容都是关于通知发送命令的帖子,这些帖子缺少整个进度条的概念。否则,它主要是单杠(bash脚本中有很多计数占位符)。真的,我需要做的就是调用amix&pactl,所以像pvol.py中的gtk进度栏这样的简单事情就很好了-只是不是那么蓝,也不在屏幕中间。

当您在全屏模式下滚动鼠标滚轮时,VLC就是一个很好的例子:

VLC垂直音量条

与屏幕中央的普通框相比,它的阻碍性要小得多:

OSD水平通知

除了在左右扬声器之间平移音频之外,整个水平滑块的类比对我来说从来没有多大意义。

无论如何,如何调用默认的桌面通知(尤其是LXDE)?我看到了很多有关配置按键事件的文章,但是关于这些事件触发什么脚本的文章并不多。纵向看中部门还有哪些其他选择?

另外,是否应该卸载某些软件包以防止在通过脚本和compiz或openbox命令处理的事件之间产生冲突?

更新:为了弄清楚我当前正在使用什么OSD,我没有立即更改静音按钮的方式。杀死xfce4-notifyd,然后按下静音按钮会产生一个新的xfce4-notifyd进程,所以我猜到大扬声器图标来自xfce4-volumed之类的东西,但是我实际上没有安装该软件包...啊哈!杀死gnome-settings-daemon会在屏幕中心停止大型OSD。


1
注意:使用LXDE时,您必须杀死面板并在停止Pulseaudio时重新生成面板,否则lxpanel将开始占用CPU。
2013年

5
哇,这是一个很棒且经过深思熟虑的问题!+1
塞斯(Seth)2013年

Answers:


10

好吧,冒着回答我自己问题的风险,我从上面问题中的链接中想出了一些被伪造的pyqt版本的pvol。如果没有别的,也许其他人可以改善我的代码。最终,我打算摆脱脚本中未使用的部分,或者将bash脚本排除在等式之外,并让一个pyqt脚本处理所有按钮事件。现在,OSD从第一次按下按钮开始就以恒定的速率超时,而不是在最后一次按下按钮后保持固定的时间。

只需复制,粘贴和保存文件(名称以粗体显示),将它们全部放在同一目录中,设置可执行位,并根据保存它们的位置修改pyqt脚本中的系统调用,或将它们全部放入路径中的目录。然后,将外壳程序脚本映射到Compiz命令,Openbox快捷方式或类似内容,如果不使用多媒体键盘音量按钮,则更改pyqt脚本。

注意:类名Qvol是一个有效的标题,我没有费心去更改它。另请注意,静音按钮未使用-这只是一个原型,用来表达实现所需功能的可能途径,并且当前不与任何类型的托管项目或标准开发模型相关联。从下面的代码获得的任何重大发展都应该属于Sourceforge,GitHub或项目网站。就是说,随时编辑此答案或建议一个允许其功能和设计相似的现有项目。

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

音量步进bash脚本的“无声”参数是一种虚拟的hack-脚本除了对参数进行测试以外,实际上不对其进行任何操作,只能测试其是否存在。因此,您可以在其中插入任何具有相同效果的东西。
2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.