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

Ada*_*dam 15 notification shortcut-keys pulseaudio software-recommendation alsa

有没有一种奇特的方法可以让音量通知 OSD 与 pulseaudio 和 ALSA 一起使用?现在,标准的台式机只适用于我的pulseaudio。我可以使用垂直 OSD 作为替代品的下降或从命令行调用以图形方式报告任意百分比的变化,作为一个上下移动的条形图怎么样?

我需要它与 ALSA 和 pulseaudio 一起工作的原因是我使用的 WINE 应用程序不能很好地与脉冲一起工作,所以我在启动 Windows 应用程序之前杀死了脉冲以使用 ALSA 而没有额外的抽象层。当我意识到键盘上的音量键在没有脉冲的情况下无法工作时,我编写了一些 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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

脚本工作得很好,映射到按钮也很好,但是我不再有很好的方式来查看视觉反馈——即使是脉冲音频的也不行,因为我正在捕捉按钮事件(XF86AudioLowerVolume 等)。显然我可以将 ALSA 音量键映射到其他东西,但复制快捷键没有意义。

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

pvol.py -s 在屏幕上显示 ALSA 和 pulseaudio 的当前音量级别,但与我一直使用的 gnome OSD 相比,它非常小,而且它不是垂直的(顶部的条形图,底部的旧 OSD):

Standard 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。

Ada*_*dam 10

好吧,冒着回答我自己的问题的风险,我从上面问题中的链接中想出了一些 pyqt 版本的 pvol。如果不出意外,也许其他人可以改进我的代码。最终,我计划要么去掉下面脚本中未使用的部分,要么去掉 bash 脚本,让一个 pyqt 脚本处理所有按钮事件。现在,OSD 从第一次按下按钮开始以恒定的速率超时,而不是在最后一次按下按钮后保持固定的时间。

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

注意:类名 Qvol 是一个工作标题,我没有费心去更改它。另请注意,静音按钮未处理——这只是一个原型,用于表达实现所请求功能的可能途径,目前与任何类型的托管项目或标准开发模型无关。任何源自以下代码的重大开发都应该属于 Sourceforge、GitHub 或项目网站。也就是说,可以随意编辑这个答案或建议一个现有的项目,它允许在功能和设计上相似。

容积率

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

容积率

#!/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()  
Run Code Online (Sandbox Code Playgroud)