web-dev-qa-db-ja.com

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

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

ALSAとpulseaudioの両方で動作する必要があるのは、Pulseでうまく動作しないWINEアプリケーションを使用しているため、Windowsアプリを起動する前にPulseを終了して、余分な抽象化レイヤーなしでALSAを使用するためです。キーボードのボリュームキーがPulseなしでは機能しないことに気付いたとき、CompizまたはOpenbox(CCSMとlxde-rc.xmlでそれぞれ構成)で呼び出して、pulseaudio --checkからの終了信号をキャッチするbashスクリプトを作成しましたそして、それに応じて音量を調整します。

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):

Size comparison of Standard OSD and pvol.py

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

enter image description here

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

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

VLCには、フルスクリーンモードでマウスホイールをスクロールしたときに思い描いているものの良い例があります。

VLC Vertical Volume Bar

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

Horizontal OSD Volume Notification

左右のスピーカー間でオーディオをパンする以外、水平スライダーの類推全体は私にとってあまり意味がありませんでした。

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

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

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

15
Adam

申し分なく、私自身の質問に答えるリスクがあるので、上の質問のリンクから、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 __== '__main__':
    main()  
10
Adam