ALSAとpulseaudioの両方で動作する派手な垂直通知OSDはありますか?


15

pulseaudioとALSAの両方で動作するようにボリューム通知OSDを取得する派手な方法はありますか?今のところ、標準のデスクトップのものは私にとってはpulseaudioでしか動作しません。ドロップイン置換として使用したり、コマンドラインから呼び出して、任意の割合で上下に移動するバーとしてグラフィカルにレポートできる垂直OSDはどうですか?

ALSAとpulseaudioの両方で動作する必要がある理由は、pulseでうまく再生できないWINEアプリケーションを使用しているため、Windowsアプリを起動する前にpulseを削除して、余​​分な抽象化レイヤーなしでALSAを使用することです。私は私のキーボードのボリュームキーは、パルスせずに仕事をしなかったことを気づいたとき、私はからの出口信号をキャッチするCompizのか(それぞれ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など)をキャッチしているので、pulseaudioでも視覚的なフィードバックを見る良い方法がありません。明らかに、ALSAボリュームキーを他のキーにマップすることはできますが、ショートカットキーを複製する意味はありません。

上記のスクリプトで呼び出すことができるpythonボリュームコントロールを見つけました:https :
//github.com/fishman/utils/blob/master/pvol.py

pvol.py -s ALSAとpulseaudioの両方の現在の音量レベルを画面に表示しますが、使用していたgnome OSDと比べて非常に小さく、垂直ではありません(上部のバー、下部の古いOSD):

標準OSDとpvol.pyのサイズ比較

だから、私はそれを大きくし、フロップしました:

ここに画像の説明を入力してください

ただし、向きを縦向きに切り替えても、青いデフォルトのGTKテーマはVLCほど滑らかではありません(以下を参照)。

OSD実装の検索で私が見つけたものの多くは、プログレスバーの概念全体が欠けているnotify-sendコマンドに関する投稿です。それ以外の場合は、主に水平バー(およびbashスクリプト内の多くのカウントプレースホルダー)です。本当に必要なのはamixとpactlを呼び出すことだけなので、pvol.pyのgtkプログレスバーのような単純なものは素晴らしいでしょう。

VLCには、フルスクリーンモードでマウスホイールをスクロールする際に念頭に置いたものの良い例があります。

VLC垂直ボリュームバー

画面の中央にある通常のボックスよりも邪魔になりません。

水平OSDボリューム通知

左右のスピーカー間でオーディオをパンする以外、水平スライダーの例えはまったく意味がありませんでした。

とにかく、デフォルトのデスクトップ通知が呼び出されるのはどうですか(特にLXDE)?キープレスイベントの構成に関する多くの記事を参照しますが、それらのイベントがトリガーするスクリプトについてはあまり説明しません。垂直に凝った部門には、他にどのようなオプションがありますか?

また、スクリプトとcompizまたはopenboxコマンドで処理しているイベント間で競合が発生するのを防ぐために、アンインストールする必要があるパッケージはありますか?

更新:現在使用しているOSDを把握するために、ミュートボタンの処理方法をすぐに変更しませんでした。xfce4-notifydを終了してからミュートボタンを押すと、新しいxfce4-notifydプロセスが生成されるため、大きなスピーカーアイコンはxfce4-volumedのようなものから来たと推測していましたが、実際にはそのパッケージはインストールされていません... gnome-settings-daemonを強制終了すると、画面の中央にある大きなOSDが停止します。


1
注:LXDEでは、pulseaudioを停止するか、lxpanelがCPUを使い果たし始めると、パネルを強制終了して再生成する必要があります。
アダム

5
なんてすごい、よく考えられた質問でしょう!+1
セス

回答:


10

申し分なく、私自身の質問に答えるリスクがあるので、上の質問のリンクから、pvolのpyqtバージョンがハッキングされたものを少し見つけました。他に何もなければ、誰かが私のコードを改善できるかもしれません。最終的には、以下のスクリプトの未使用部分を取り除くか、bashスクリプトを式から除外して、1つのpyqtスクリプトですべてのボタンイベントを処理する予定です。現在、OSDは、最後のボタンを押してから一定時間オンのままではなく、最初のボタンを押してから一定の速度でタイムアウトします。

(太字の名前で)ファイルをコピー、貼り付け、保存し、すべてを同じディレクトリに配置し、実行可能ビットを設定し、保存場所に応じてpyqtスクリプトでシステムコールを変更するか、パスにあるディレクトリ。次に、シェルスクリプトをCompizコマンド、Openboxショートカットなどにマップし、マルチメディアキーボードの音量ボタンを使用していない場合はpyqtスクリプトを変更します。

注:クラス名Qvolは実際のタイトルであり、変更することはありません。また、ミュートボタンは処理されないことに注意してください。これは、要求された機能を実現するための可能な手段を表すための単なるプロトタイプであり、現在、いかなる種類のホストプロジェクトまたは標準開発モデルとも関連付けられていません。以下のコードから派生したあらゆる種類の重要な開発は、おそらくSourceforge、GitHub、またはプロジェクトWebサイトに属している必要があります。とはいえ、この回答を自由に編集したり、機能とデザインが似ている既存のプロジェクトを提案してください。

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スクリプトの「サイレント」引数は、一種のダミーハックです。スクリプトは、引数が存在するかどうかをテストする以外に、実際には引数で何も行いません。したがって、同じ効果でそこに何でもプラグインできます。
アダム
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.