Apakah ada OSD pemberitahuan vertikal yang bagus yang berfungsi untuk ALSA dan pulseaudio?

15

Apakah ada cara mewah untuk mendapatkan notifikasi volume OSD untuk bekerja dengan pulseaudio dan ALSA? Saat ini desktop standar hanya bekerja dengan pulseaudio untuk saya. Bagaimana dengan OSD vertikal yang dapat saya gunakan sebagai setetes penggantian atau panggilan dari baris perintah untuk melaporkan perubahan dalam persentase sewenang-wenang secara grafis, sebagai bilah yang bergerak naik dan turun?

Alasan mengapa saya memerlukannya untuk bekerja dengan ALSA dan pulseaudio adalah karena saya menggunakan aplikasi WINE yang tidak cocok dengan pulsa, jadi saya mematikan pulsa sebelum memulai aplikasi Windows untuk menggunakan ALSA tanpa lapisan abstraksi ekstra. Ketika saya menyadari bahwa tombol volume pada keyboard saya tidak berfungsi tanpa pulsa, saya menulis beberapa skrip bash yang saya panggil dengan Compiz atau Openbox (masing-masing dikonfigurasi melalui CCSM dan lxde-rc.xml) untuk menangkap sinyal keluar dari pulseaudio --checkdan kemudian sesuaikan volume sesuai:

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

Skrip bekerja dengan baik dan memetakan ke tombol dengan baik, tetapi saya tidak memiliki cara yang baik untuk melihat umpan balik visual lagi - bahkan dengan pulseaudio karena saya menangkap peristiwa tombol (XF86AudioLowerVolume, dll.). Jelas saya hanya bisa memetakan kunci volume ALSA ke sesuatu yang lain, tetapi tidak ada gunanya menduplikasi tombol pintas.

Saya memang menemukan kontrol volume python yang bisa saya panggil dalam skrip di atas:
https://github.com/fishman/utils/blob/master/pvol.py

pvol.py -s menunjukkan level volume saat ini di layar untuk ALSA dan pulseaudio, tetapi sangat kecil dibandingkan dengan OSD gnome yang saya gunakan, dan ini bukan vertikal (bilah di atas, OSD lama di bawah):

Perbandingan ukuran Standard OSD dan pvol.py

Jadi, saya membuatnya lebih besar dan menjatuhkannya di sekitar:

masukkan deskripsi gambar di sini

Tetapi, bahkan dengan mengalihkan orientasi ke yang vertikal, tema GTK standar biru tidak cukup apik seperti VLC (lihat di bawah).

Banyak dari apa yang saya temukan dalam mencari implementasi OSD adalah posting tentang perintah notify-send yang tidak memiliki keseluruhan konsep progress bar. Jika tidak, sebagian besar bilah horizontal (dan banyak penghitung placeholder dalam skrip bash). Benar-benar semua yang perlu saya lakukan adalah memanggil amix & pactl, jadi sesuatu yang sederhana seperti progress bar gtk di pvol.py akan bagus - tidak begitu biru dan tidak tepat di tengah layar.

VLC memiliki contoh bagus tentang apa yang ada dalam pikiran saya ketika Anda menggulir roda mouse dalam mode layar penuh:

VLC Volume Volume Vertikal

Ini jauh lebih sedikit obstruktif daripada kotak biasa yang duduk di tengah layar:

Pemberitahuan Volume OSD Horisontal

Analogi slider horizontal keseluruhan tidak pernah masuk akal bagi saya di luar audio panning antara speaker kiri dan kanan.

Lagi pula, bagaimana mungkin notifikasi desktop default dipanggil (terutama LXDE)? Saya melihat banyak posting tentang mengkonfigurasi acara pers utama, tetapi tidak banyak tentang skrip apa yang dipicu oleh peristiwa tersebut. Apa pilihan lain di luar sana di departemen mewah vertikal?

Juga, apakah ada beberapa paket yang harus saya hapus untuk mencegah konflik muncul antara peristiwa yang saya tangani melalui scripting dan compiz atau perintah openbox?

Pembaruan: Demi mencari tahu OSD apa yang saya gunakan saat ini, saya tidak langsung mengubah cara saya menangani tombol bisu. Membunuh xfce4-notifyd dan kemudian menekan tombol mute memunculkan proses xfce4-notifyd baru, jadi saya menduga ikon speaker besar berasal dari sesuatu seperti xfce4-volumed, tapi saya tidak benar-benar menginstal paket itu ... Ah ha! Membunuh gnome-settings-daemon menghentikan OSD besar di tengah layar.

Adam
sumber
1
CATATAN: Dengan LXDE, Anda harus mematikan panel dan respawn ketika Anda menghentikan pulseaudio atau lxpanel akan mulai memakan CPU.
Adam
5
Wow pertanyaan yang luar biasa dan dipikirkan dengan baik! +1
Seth

Jawaban:

10

Baiklah, dengan risiko menjawab pertanyaan saya sendiri, saya datang dengan versi pqt pyqt yang diretas bersama dari tautan dalam pertanyaan di atas. Jika tidak ada yang lain, mungkin orang lain dapat memperbaiki kode saya. Akhirnya, saya berencana untuk menyingkirkan bagian-bagian dalam skrip di bawah ini yang tidak digunakan atau untuk mengambil skrip bash dari persamaan dan meminta satu skrip pyqt menangani semua peristiwa tombol. Saat ini, OSD time out dengan laju konstan dari tombol pertama yang ditekan alih-alih bertahan untuk waktu yang tetap setelah tombol terakhir ditekan.

Cukup salin, tempel, dan simpan file (dengan nama yang dicetak tebal), letakkan semuanya di direktori yang sama, tetapkan bit yang dapat dieksekusi, dan ubah panggilan sistem dalam skrip pyqt sesuai dengan tempat Anda menyimpannya, atau masukkan semuanya ke dalam direktori yang ada di jalur Anda. Kemudian petakan skrip shell ke perintah Compiz, pintasan Openbox, atau yang serupa, dan ubah skrip pyqt jika Anda tidak menggunakan tombol volume keyboard multimedia.

Catatan: Nama kelas Qvol adalah judul yang berfungsi, dan saya tidak repot-repot mengubahnya. Harap perhatikan juga bahwa tombol mute tidak dapat ditangani - Ini hanyalah prototipe untuk mengekspresikan kemungkinan jalan untuk memenuhi fitur yang diminta, dan saat ini tidak terkait dengan proyek apa pun yang di-host atau model pengembangan standar. Segala jenis pengembangan signifikan yang berasal dari kode di bawah ini mungkin seharusnya berasal dari Sourceforge, GitHub atau situs web proyek. Yang mengatakan, jangan ragu untuk mengedit jawaban ini atau untuk menyarankan proyek yang ada yang memungkinkan memiliki fungsi dan desain yang serupa.

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
sumber
Argumen "silent" untuk skrip bash volume step adalah sejenis hack tiruan - Skrip tidak benar-benar melakukan apa pun dengan argumen selain untuk menguji apakah ada. Jadi Anda bisa pasang apa saja di sana dengan efek yang sama.
Adam