ALSA와 펄스 오디오 모두에서 작동하는 멋진 수직 알림 OSD가 있습니까?


15

볼륨 알림 OSD를 펄스 오디오 및 ALSA와 함께 사용할 수있는 멋진 방법이 있습니까? 현재 표준 데스크탑은 펄스 오디오에서만 작동합니다. 수직 드롭 다운 OSD를 사용하거나 명령 줄에서 호출하여 임의의 백분율로 변경 사항을 그래픽으로 위아래로 움직이는 막대로보고 할 수 있습니까?

ALSA와 pulseaudio 모두에서 작동 해야하는 이유는 펄스와 잘 어울리지 않는 WINE 응용 프로그램을 사용하고 있기 때문에 추가 추상화 계층없이 ALSA를 사용하기 위해 Windows 앱을 시작하기 전에 펄스를 죽입니다. 내 키보드의 볼륨 키 펄스없이 일을하지 않았다는 것을 깨달았을 때, 나는에서 출구 신호를 잡으려고 컴 피즈 또는 (각각 CCSM 및 LXDE - rc.xml를 통해 구성) OPENBOX 중 하나에 전화를 몇 가지 bash는 스크립트를 작성 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 볼륨 키를 다른 것으로 매핑 할 수 있지만 바로 가기 키를 복제하는 것은 의미가 없습니다.

위의 스크립트에서 호출 할 수있는 파이썬 볼륨 컨트롤을 찾았습니다 :
https://github.com/fishman/utils/blob/master/pvol.py

pvol.py -s ALSA와 펄스 오디오의 화면에 현재 볼륨 레벨을 보여 주지만, 사용했던 그놈 OSD에 비해 상당히 작고 수직이 아닙니다 (맨 위 막대, 맨 아래 오래된 OSD) :

표준 OSD와 pvol.py의 크기 비교

그래서 나는 그것을 더 크게 만들고 주위를 펄럭였다.

여기에 이미지 설명을 입력하십시오

그러나 방향을 세로 방향으로 전환하더라도 파란색 기본 GTK 테마는 VLC만큼 매끄럽지 않습니다 (아래 참조).

OSD 구현 검색에서 찾은 대부분은 전체 진행 표시 줄 개념이없는 알림 보내기 명령에 대한 게시물입니다. 그렇지 않으면 주로 가로 막대이며 bash 스크립트 내에 많은 계산 자리 표시자가 있습니다. 실제로 내가해야 할 일은 amix & pactl을 호출하는 것이므로 pvol.py의 gtk 진행률 표시 줄과 같은 간단한 것은 훌륭합니다.

VLC에는 마우스 휠을 전체 화면 모드로 스크롤 할 때 염두에 두는 좋은 예가 있습니다.

VLC 수직 볼륨 바

화면 중앙에있는 일반적인 상자보다 훨씬 덜 방해가됩니다.

수평 OSD 볼륨 알림

전체 수평 슬라이더 비유는 왼쪽 및 오른쪽 스피커 사이의 패닝 오디오 외부에서 나에게 의미가 없었습니다.

어쨌든 기본 데스크탑 알림 (특히 LXDE)이 어떻게 호출됩니까? 주요 프레스 이벤트 구성에 대한 많은 게시물을 보았지만 해당 이벤트가 트리거하는 스크립트에 대해서는별로 언급하지 않았습니다. 세로로 멋진 부서에 다른 옵션이 있습니까?

또한 스크립팅 및 compiz 또는 openbox 명령을 통해 처리하는 이벤트간에 충돌이 발생하지 않도록 제거해야 할 패키지가 있습니까?

업데이트 : 현재 사용중인 OSD를 파악하기 위해 음소거 버튼을 처리하는 방식을 즉시 변경하지 않았습니다. xfce4 알림을 종료 한 다음 음소거 버튼을 누르면 새로운 xfce4 알림 프로세스가 생성되므로 큰 스피커 아이콘이 xfce4 볼륨과 같은 것에서 나온 것 같지만 실제로는 해당 패키지가 설치되어 있지 않습니다 ... 아! gnome-settings-deemon을 종료하면 화면 중앙의 큰 OSD가 중지됩니다.


1
참고 : LXDE를 사용하면 pulseaudio를 중지하면 패널을 종료하고 다시 생성해야합니다. 그렇지 않으면 lxpanel이 CPU를 소모하기 시작합니다.
Adam

5
와우, 굉장하고 잘 생각 된 질문! +1
세스

답변:


10

좋아, 내 자신의 질문에 대답 할 위험에 처한 위의 링크에서 pvol의 pyqt 버전을 약간 해킹했습니다. 다른 것이 없다면 다른 사람이 내 코드를 향상시킬 수 있습니다. 결국, 아래 스크립트에서 사용되지 않는 부분을 제거하거나 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 스크립트의 "자동"인수는 일종의 더미 핵입니다. 스크립트는 실제로 존재하는지 테스트하는 것 이외의 인수로 아무것도하지 않습니다. 따라서 동일한 효과로 무엇이든 연결할 수 있습니다.
Adam
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.