Существует ли необычное вертикальное уведомление OSD, который работает и на ALSA и на pulseaudio?

Существует ли необычный способ заставить уведомление об объеме OSD работать и с pulseaudio и с ALSA? Прямо сейчас стандартные настольные только работают с pulseaudio для меня. Как насчет вертикального OSD, который я могу использовать в качестве понижения замены или вызова из командной строки для создания отчетов об изменениях в произвольных процентах графически как панель, которая перемещается вверх и вниз?

Причина, почему мне нужен он для работы и с ALSA и с pulseaudio, состоит в том, что я использую ВИННОЕ приложение, которое не играет хорошо с импульсом, таким образом, я уничтожаю импульс перед запуском Приложения Windows для использования ALSA без дополнительного уровня абстракции. Когда я понял, что кнопки громкости на моей клавиатуре не работали без импульса, я записал некоторые сценарии удара, которые я называю или с 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, но это является ужасно крошечным по сравнению с гномом OSD, который я использовал, и это не вертикально (панель на главном, старом OSD в основе):

Size comparison of Standard OSD and pvol.py

Так, я сделал это больше и перебросил его вокруг:

enter image description here

Но, даже с переключением ориентации к вертикальной, синяя тема GTK по умолчанию не является вполне столь же гладкой как VLC (см. ниже).

Большая часть того, что я нашел в поиске реализаций OSD, является сообщениями о, уведомляют - отправляют команды, которые испытывают недостаток в целом понятии индикатора выполнения. Иначе это - главным образом горизонтальные планки (и большой подсчет заполнителей в рамках сценариев удара). Действительно все, что я должен сделать, назвать amix и pactl, таким образом, что-то простое как gtk индикатор выполнения в pvol.py было бы большим - просто не таким образом синий и не прямо в середине экрана.

VLC имеет хороший пример того, что я имею в виду, когда Вы прокручиваете колесо мыши в полноэкранном режиме:

VLC Vertical Volume Bar

Это является намного менее препятствующим, чем обычные поля, которые находятся в центре экрана:

Horizontal OSD Volume Notification

Целая горизонтальная аналогия ползунка никогда не имела большого смысла мне за пределами панорамирования аудио между левыми и правыми динамиками.

Так или иначе, как получается, что настольные уведомления по умолчанию называют (особенно LXDE)? Я вижу много сообщений о конфигурировании событий нажатия клавиши, но не очень на том, какие сценарии те события инициировали. Что другие опции находятся там в вертикально необычном отделе?

Кроме того, есть ли некоторый пакет, который я должен удалить, чтобы препятствовать тому, чтобы конфликты возникли между событиями, которые я обрабатываю через сценарии и команды openbox или compiz?

Обновление: Ради выяснения, какой OSD я в настоящее время использую, я не изменил способ, которым я обрабатываю кнопку отключения звука сразу же. Уничтожение xfce4-notifyd и затем нажатие кнопки отключения звука порождают новый процесс xfce4-notifyd, таким образом, я предполагал, что большой значок динамика прибыл из чего-то как xfce4-volumed, но мне на самом деле не установили тот пакет... А-ч ха! Уничтожение гнома-демона настроек останавливает большой OSD в центре экрана.

15
задан 2 March 2013 в 05:01

1 ответ

Хорошо, рискуя ответить на свой вопрос, я придумал немного взломанную версию Pyqt pvol по ссылке в вопросе выше. Если ничего другого, возможно, кто-то еще может улучшить мой код. В конце концов, я планирую либо избавиться от частей в скрипте ниже, которые остаются неиспользованными, либо убрать скрипты bash из уравнения и сделать так, чтобы один скрипт pyqt обрабатывал все события кнопки. Прямо сейчас экранное меню истекает с постоянной скоростью с первого нажатия кнопки вместо того, чтобы оставаться включенным в течение фиксированного периода времени после последнего нажатия кнопки.

Просто скопируйте, вставьте и сохраните файлы (с именами, выделенными жирным шрифтом), поместите их все в один каталог, установите исполняемые биты и измените системные вызовы в скрипте 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

Пквол

#!/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()  
0
ответ дан 2 March 2013 в 05:01

Другие вопросы по тегам:

Похожие вопросы: