Существует ли необычный способ заставить уведомление об объеме 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 в основе):
Так, я сделал это больше и перебросил его вокруг:
Но, даже с переключением ориентации к вертикальной, синяя тема GTK по умолчанию не является вполне столь же гладкой как VLC (см. ниже).
Большая часть того, что я нашел в поиске реализаций OSD, является сообщениями о, уведомляют - отправляют команды, которые испытывают недостаток в целом понятии индикатора выполнения. Иначе это - главным образом горизонтальные планки (и большой подсчет заполнителей в рамках сценариев удара). Действительно все, что я должен сделать, назвать amix и pactl, таким образом, что-то простое как gtk индикатор выполнения в pvol.py было бы большим - просто не таким образом синий и не прямо в середине экрана.
VLC имеет хороший пример того, что я имею в виду, когда Вы прокручиваете колесо мыши в полноэкранном режиме:
Это является намного менее препятствующим, чем обычные поля, которые находятся в центре экрана:
Целая горизонтальная аналогия ползунка никогда не имела большого смысла мне за пределами панорамирования аудио между левыми и правыми динамиками.
Так или иначе, как получается, что настольные уведомления по умолчанию называют (особенно LXDE)? Я вижу много сообщений о конфигурировании событий нажатия клавиши, но не очень на том, какие сценарии те события инициировали. Что другие опции находятся там в вертикально необычном отделе?
Кроме того, есть ли некоторый пакет, который я должен удалить, чтобы препятствовать тому, чтобы конфликты возникли между событиями, которые я обрабатываю через сценарии и команды openbox или compiz?
Обновление: Ради выяснения, какой OSD я в настоящее время использую, я не изменил способ, которым я обрабатываю кнопку отключения звука сразу же. Уничтожение xfce4-notifyd и затем нажатие кнопки отключения звука порождают новый процесс xfce4-notifyd, таким образом, я предполагал, что большой значок динамика прибыл из чего-то как xfce4-volumed, но мне на самом деле не установили тот пакет... А-ч ха! Уничтожение гнома-демона настроек останавливает большой OSD в центре экрана.
Хорошо, рискуя ответить на свой вопрос, я придумал немного взломанную версию Pyqt pvol по ссылке в вопросе выше. Если ничего другого, возможно, кто-то еще может улучшить мой код. В конце концов, я планирую либо избавиться от частей в скрипте ниже, которые остаются неиспользованными, либо убрать скрипты bash из уравнения и сделать так, чтобы один скрипт pyqt обрабатывал все события кнопки. Прямо сейчас экранное меню истекает с постоянной скоростью с первого нажатия кнопки вместо того, чтобы оставаться включенным в течение фиксированного периода времени после последнего нажатия кнопки.
Просто скопируйте, вставьте и сохраните файлы (с именами, выделенными жирным шрифтом), поместите их все в один каталог, установите исполняемые биты и измените системные вызовы в скрипте pyqt в соответствии с тем, где вы их сохраняете, или поместите все они в каталоге, который находится на вашем пути. Затем сопоставьте сценарии оболочки с командами 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
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()