Чи є фантастичний вертикальний екран сповіщень, який працює як для ALSA, так і для pulseaudio?


15

Чи є фантастичний спосіб отримати екранне повідомлення про гучність для роботи з pulseaudio та ALSA? Зараз стандартні настільні для мене працюють лише з pulseaudio. Як щодо вертикальної екранного меню, яку я можу використовувати як падіння заміни або виклик з командного рядка, щоб повідомити про зміни довільних відсотків графічно, як смугу, яка рухається вгору і вниз?

Причина, чому мені потрібно, щоб він працював як з 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

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

Сценарії чудово працюють і відображають кнопки просто чудово, але я більше не маю гарного способу бачити візуальний зворотній зв'язок - навіть не з імпульсними, оскільки я ловлю події на кнопки (XF86AudioLowerVolume тощо). Очевидно, що я міг просто зіставити клавіші гучності ALSA на щось інше, але дублювати клавіші швидкого доступу немає сенсу.

Я знайшов контроль гучності python, який я можу викликати у вищезазначених сценаріях:
https://github.com/fishman/utils/blob/master/pvol.py

pvol.py -s показує поточний рівень гучності на екрані як для ALSA, так і для pulseaudio, але він жахливо крихітний у порівнянні з екраном для gnome, який я використовував, і він не вертикальний (смуга вгорі, стара ОЗД внизу):

Порівняння розмірів Standard OSD та pvol.py

Отже, я зробив це більше і обернув його навколо:

введіть тут опис зображення

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

Більшість з того, що я виявив у пошуку реалізацій екранного меню, - це повідомлення про команди сповіщення-відправлення, яким не вистачає всієї концепції панелі прогресу. В іншому випадку це здебільшого горизонтальні смуги (і безліч підрахунків заповнювачів у скриптах bash). Дійсно, все, що мені потрібно зробити, це зателефонувати в amix & pactl, тому щось просте, як-то смужка прогресу gtk у pvol.py, було б чудово - просто не так синьо і не прямо в середині екрана.

VLC має хороший приклад того, що я маю на увазі, коли ви прокручуєте колесо миші в повноекранному режимі:

Вертикальна панель гучності VLC

Це набагато менш обструктивно, ніж звичайні поля, які сидять в центрі екрану:

Горизонтальне повідомлення про гучність екранного меню

Вся аналогія горизонтального слайдера ніколи не мала для мене особливого сенсу поза панорами звуку між лівим і правим динаміками.

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

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

Оновлення: задля з'ясування того, який екранний екран я зараз використовую, я не змінив способу управління кнопкою відключення звуку одразу. Вбивство xfce4-notifyd, а потім натискання кнопки "відключити звук" породжує новий процес xfce4-notifyd, тож я здогадувався, що піктограма "великий динамік" походить із чогось на зразок xfce4-об'ємного, але у мене фактично не встановлено цей пакет ... А-а-а! Вбивство налаштувань gnome-демона зупиняє великий екран в центрі екрана.


1
ПРИМІТКА. За допомогою LXDE вам доведеться вбити панель і відновлювати її, коли ви зупините pulseaudio або lxpanel почне з'їдати процесор.
Адам

5
Нічого собі, яке дивовижне і добре продумане запитання! +1
Сет

Відповіді:


10

Гаразд, ризикуючи відповісти на моє власне запитання, я придумав трохи злому версію pqt pvolt 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

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 bash - це різновид фіктивного злому - сценарії насправді нічого не роблять з аргументом, окрім як перевірити, чи він існує. Тому ви можете підключити все, що завгодно, з тим же ефектом.
Адам
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.