क्या एक फैंसी वर्टिकल नोटिफिकेशन OSD है जो ALSA और pulseaudio दोनों के लिए काम करता है?


15

क्या वॉल्यूम नोटिफिकेशन ओएसडी को पल्सेडियो और एएलएसए दोनों के साथ काम करने का एक फैंसी तरीका है? अभी मानक डेस्कटॉप वाले केवल मेरे लिए pulseaudio के साथ काम करते हैं। एक ऊर्ध्वाधर ओएसडी के बारे में कैसे कहा जा सकता है कि मैं प्रतिस्थापन में एक बूंद के रूप में उपयोग कर सकता हूं या कमांड लाइन से कॉल करके मनमाने ढंग से प्रतिशत में बदलाव की रिपोर्ट कर सकता हूं, एक बार के रूप में जो ऊपर और नीचे चलता है?

यह कारण है कि मुझे एएलएसए और पल्सेडियो दोनों के साथ काम करने की आवश्यकता है क्योंकि मैं एक वाइन एप्लिकेशन का उपयोग कर रहा हूं जो पल्स के साथ अच्छी तरह से नहीं खेलता है, इसलिए मैं अतिरिक्त एब्सट्रैक्शन परत के बिना एएलएसए का उपयोग करने के लिए विंडोज ऐप शुरू करने से पहले पल्स को मारता हूं। जब मुझे महसूस हुआ कि मेरे कीबोर्ड पर वॉल्यूम कुंजियाँ बिना पल्स के काम नहीं करती हैं, तो मैंने कुछ बैश स्क्रिप्ट लिखीं, जिन्हें मैं कम्पिज़ या ओपनबॉक्स (क्रमशः 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 वॉल्यूम कुंजियों को मैप कर सकता हूं, लेकिन शॉर्टकट कुंजियों को डुप्लिकेट करने में कोई मतलब नहीं है।

मुझे एक अजगर मात्रा पर नियंत्रण मिला, जिसे मैं उपरोक्त लिपियों में कॉल कर सकता हूं:
https://github.com/fishman/utils/blob/master/pvol.py

pvol.py -s ALSA और pulseaudio दोनों के लिए स्क्रीन पर वर्तमान वॉल्यूम स्तर दिखाता है, लेकिन यह मेरे द्वारा उपयोग किए जा रहे गनोम OSD की तुलना में बहुत कम है, और यह ऊर्ध्वाधर नहीं है (शीर्ष पर बार, नीचे पुराना OSD):

मानक OSD और pvol.py का आकार तुलना

तो, मैंने इसे बड़ा किया और इसे चारों ओर से फ्लॉप कर दिया:

यहाँ छवि विवरण दर्ज करें

लेकिन, यहां तक ​​कि अभिविन्यास को एक ऊर्ध्वाधर पर स्विच करने के साथ, नीली डिफ़ॉल्ट जीटीके थीम वीएलसी के रूप में काफी चालाक नहीं है (नीचे देखें)।

ओएसडी कार्यान्वयन की खोज में मैंने जो कुछ पाया है, वह नोटिफ़िकेशन-सेंड कमांड के बारे में पोस्ट हैं जिनमें संपूर्ण प्रगति बार अवधारणा का अभाव है। अन्यथा, यह ज्यादातर क्षैतिज पट्टियाँ (और बैश स्क्रिप्ट के भीतर बहुत सारे प्लेसहोल्डर्स हैं)। वास्तव में मुझे बस इतना करना है कि एमिक्स और पेक्टल को कॉल करना है, इसलिए pvol.py में gtk प्रगति बार की तरह कुछ सरल होगा - बस इतना नीला नहीं और स्क्रीन के बीच में सही नहीं।

जब आप पूर्ण स्क्रीन मोड में माउस व्हील को स्क्रॉल करते हैं तो VLC का एक अच्छा उदाहरण है जो मेरे मन में है:

VLC वर्टिकल वॉल्यूम बार

यह स्क्रीन के केंद्र में बैठने वाले सामान्य बक्से की तुलना में बहुत कम अवरोधक है:

क्षैतिज OSD वॉल्यूम अधिसूचना

पूरे क्षैतिज स्लाइडर सादृश्य ने मुझे बाएं और दाएं वक्ताओं के बीच ऑडियो को पैन करने के बाहर कभी ज्यादा मायने नहीं रखा है।

वैसे भी, यह कैसे होता है कि डिफ़ॉल्ट डेस्कटॉप सूचनाएं (विशेष रूप से LXDE) कहा जाता है? मुझे मुख्य प्रेस घटनाओं को कॉन्फ़िगर करने के बारे में बहुत सारी पोस्टें दिखाई देती हैं, लेकिन उन घटनाओं को ट्रिगर करने वाली स्क्रिप्ट्स पर ज्यादा नहीं। खड़ी फैंसी विभाग में और क्या विकल्प हैं?

इसके अलावा, वहाँ कुछ पैकेज है जिसे मैं स्क्रिप्टिंग और कॉम्पिज़ या बॉक्सबॉक्स कमांड के माध्यम से संभाल रही घटनाओं के बीच टकराव से रोकने के लिए अनइंस्टॉल करना चाहिए?

अपडेट: इस बात का पता लगाने के लिए कि मैं वर्तमान में किस ओएसडी का उपयोग कर रहा हूं, मैंने अभी म्यूट बटन को संभालने के तरीके को नहीं बदला है। Xfce4- नोटिफ़ाइड को मारना और फिर म्यूट बटन को दबाने से एक नई xfce4- नोटिफ़िकेशन प्रक्रिया शुरू होती है, इसलिए मैं अनुमान लगा रहा था कि बड़े स्पीकर आइकन xfce4-volumed जैसी किसी चीज़ से आए हैं, लेकिन मैं वास्तव में उस पैकेज को स्थापित नहीं करता ... आह हा! सूक्ति-सेटिंग-डेमॉन को मारना स्क्रीन के केंद्र में बड़े OSD को रोकता है।


1
नोट: LXDE के साथ, आपको पैनल को मारना होगा और जब आप pulseaudio बंद कर देंगे या lxpanel सीपीयू को खाना शुरू कर देंगे, तब उसे रिस्पांस करना होगा।
एडम

5
वाह क्या बढ़िया और अच्छा सोचा सवाल! +1
सेठ

जवाबों:


10

ठीक है, अपने स्वयं के प्रश्न का उत्तर देने के जोखिम पर, मैं ऊपर दिए गए प्रश्न में लिंक से pvol का एक हैक किए गए एक साथ pyol संस्करण को लेकर आया था। अगर और कुछ नहीं, तो शायद कोई और मेरे कोड में सुधार कर सकता है। आखिरकार, मैं या तो स्क्रिप्ट के उन हिस्सों से छुटकारा पाने की योजना बनाता हूं, जो अप्रयुक्त हो जाते हैं या बैश स्क्रिप्ट को समीकरण से बाहर ले जाते हैं और एक pytt स्क्रिप्ट को बटन घटनाओं के सभी संभालते हैं। अभी, पिछले बटन प्रेस के बाद निश्चित समय तक रहने के बजाय पहले बटन प्रेस से स्थिर दर पर ओएसडी बार।

बस फाइलों को कॉपी, पेस्ट और सेव (बोल्ड में नामों के साथ) करें, उन सभी को एक ही डायरेक्टरी में रखें, एक्जीक्यूटेबल बिट्स सेट करें, और जहाँ भी आप उन्हें सेव करते हैं, उसके अनुसार 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()  

वॉल्यूम स्टेप बैश स्क्रिप्ट के लिए "साइलेंट" तर्क एक डमी हैक की तरह है - स्क्रिप्ट वास्तव में तर्क के साथ कुछ भी नहीं करती है अगर यह मौजूद है तो परीक्षण के अलावा। तो आप उसी प्रभाव के साथ वहां कुछ भी प्लग कर सकते हैं।
एडम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.