มี OSD การแจ้งเตือนแนวตั้งที่เหมาะกับทั้ง ALSA และ pulseaudio หรือไม่


15

มีวิธีแฟนซีในการรับ OSD การแจ้งเตือนปริมาณให้ทำงานกับทั้ง pulseaudio และ ALSA หรือไม่? ตอนนี้เดสก์ทอปธรรมดานั้นใช้งานได้กับ pulseaudio สำหรับฉันเท่านั้น แล้ว OSD แนวตั้งที่ฉันสามารถใช้แทนการปล่อยหรือเรียกจากบรรทัดคำสั่งเพื่อรายงานการเปลี่ยนแปลงเป็นเปอร์เซ็นต์ตามอำเภอใจกราฟิกเป็นแถบที่เลื่อนขึ้นและลงได้อย่างไร

เหตุผลที่ฉันต้องการใช้งานกับทั้ง ALSA และ pulseaudio ก็คือฉันใช้แอปพลิเคชั่น WINE ที่เล่นได้ไม่ดีกับพัลส์ฉันจึงฆ่าพัลส์ก่อนที่จะเริ่มแอพ 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 กับสิ่งอื่นได้ แต่ไม่มีความรู้สึกในการทำซ้ำปุ่มลัด

ฉันพบการควบคุมปริมาณหลามที่ฉันสามารถโทรหาได้ในสคริปต์ด้านบน:
https://github.com/fishman/utils/blob/master/pvol.py

pvol.py -s แสดงระดับเสียงปัจจุบันบนหน้าจอสำหรับทั้ง ALSA และ pulseaudio แต่มันเล็กมากเมื่อเทียบกับ gnome OSD ที่ฉันใช้และมันไม่ใช่แนวตั้ง (แถบด้านบน OSD เก่าที่ด้านล่าง):

การเปรียบเทียบขนาดของ Standard OSD และ pvol.py

ดังนั้นฉันทำให้มันใหญ่ขึ้นและลอยไปรอบ ๆ :

ป้อนคำอธิบายรูปภาพที่นี่

แต่ถึงแม้จะมีการเปลี่ยนการวางแนวเป็นแนวตั้งธีม GTK สีฟ้าที่เป็นค่าเริ่มต้นยังไม่ราบรื่นเท่า VLC (ดูด้านล่าง)

สิ่งที่ฉันได้พบในการค้นหาการใช้งาน OSD ส่วนใหญ่จะโพสต์เกี่ยวกับคำสั่งแจ้งเตือนการส่งซึ่งขาดแนวคิดของแถบความคืบหน้าทั้งหมด ไม่เช่นนั้นจะเป็นแถบแนวนอนส่วนใหญ่ (และตัวยึดตำแหน่งนับจำนวนมากภายในสคริปต์ทุบตี) สิ่งที่ฉันต้องทำจริงๆก็คือโทรเรียก amix & pactl ดังนั้นสิ่งที่เรียบง่ายเช่นแถบความคืบหน้าของ gtk ใน pvol.py จะดีมาก - ไม่ใช่แค่สีน้ำเงินและไม่ได้อยู่กลางหน้าจอ

VLC มีตัวอย่างที่ดีของสิ่งที่ฉันมีอยู่ในใจเมื่อคุณเลื่อนล้อเลื่อนของเมาส์ในโหมดเต็มหน้าจอ:

VLC Vertical Volume Bar

มันมีสิ่งกีดขวางน้อยกว่ากล่องทั่วไปที่อยู่ตรงกลางของหน้าจอ:

การแจ้งเตือนระดับเสียง OSD แนวนอน

การเปรียบเทียบแถบเลื่อนแนวนอนทั้งคู่ไม่เคยทำให้ฉันรู้สึกนอกปรากฎเสียงระหว่างลำโพงซ้ายและขวา

อย่างไรก็ตามการแจ้งเตือนเดสก์ท็อปเริ่มต้นเป็นวิธีการที่เรียกว่า (โดยเฉพาะ LXDE) ฉันเห็นโพสต์จำนวนมากเกี่ยวกับการกำหนดค่ากิจกรรมการกดปุ่ม แต่ไม่มากกับสิ่งที่เรียกใช้สคริปต์เหตุการณ์เหล่านั้น มีตัวเลือกอื่น ๆ อะไรบ้างในแผนกแฟนซีแนวตั้ง?

นอกจากนี้ยังมีแพคเกจบางอย่างที่ฉันควรถอนการติดตั้งเพื่อป้องกันความขัดแย้งระหว่างเหตุการณ์ที่ฉันจัดการด้วยสคริปต์และคำสั่ง compiz หรือ openbox หรือไม่

อัปเดต:เพื่อหาว่า OSD ที่ฉันใช้อยู่นั้นคืออะไรฉันไม่ได้เปลี่ยนวิธีจัดการปุ่มปิดเสียงทันที การฆ่า xfce4-alertd แล้วกดปุ่มปิดเสียงวางไข่กระบวนการ xfce4-alertd ใหม่ดังนั้นฉันเดาว่าไอคอนลำโพงขนาดใหญ่มาจากสิ่งที่ชอบ xfce4-volumed แต่จริง ๆ แล้วฉันไม่ได้ติดตั้งแพ็กเกจนั้น ... อ๊ะ! การฆ่า gnome-settings-daemon หยุด OSD ขนาดใหญ่ที่กึ่งกลางหน้าจอ


1
หมายเหตุ: ด้วย LXDE คุณจะต้องฆ่าพาเนลและตอบกลับเมื่อคุณหยุด pulseaudio มิฉะนั้น lxpanel จะเริ่มกินซีพียู
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()  

อาร์กิวเมนต์ "เงียบ" สำหรับสคริปต์ทุบตีระดับเสียงเป็นแฮ็คดัมมี่ - สคริปต์ไม่ได้ทำอะไรกับอาร์กิวเมนต์ที่นอกเหนือจากการทดสอบว่ามีอยู่จริงหรือไม่ ดังนั้นคุณสามารถเสียบอะไรก็ได้ที่มีผลเหมือนกัน
Adam
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.