Có một OSD thông báo dọc ưa thích hoạt động cho cả ALSA và pulseaudio không?


15

Có cách nào lạ mắt để thông báo âm lượng OSD hoạt động với cả pulseaudio và ALSA không? Ngay bây giờ các máy tính để bàn tiêu chuẩn chỉ hoạt động với pulseaudio cho tôi. Làm thế nào về một OSD dọc mà tôi có thể sử dụng như một sự thay thế hoặc gọi từ dòng lệnh để báo cáo các thay đổi về tỷ lệ phần trăm tùy ý về mặt đồ họa, như một thanh di chuyển lên và xuống?

Lý do tại sao tôi cần nó hoạt động với cả ALSA và pulseaudio là vì tôi đang sử dụng ứng dụng WINE không hoạt động tốt với xung, vì vậy tôi giết xung trước khi khởi động ứng dụng Windows để sử dụng ALSA mà không cần thêm lớp trừu tượng. Khi tôi nhận ra rằng các phím âm lượng trên bàn phím của mình không hoạt động mà không có xung, tôi đã viết một số tập lệnh bash mà tôi gọi bằng Compiz hoặc Openbox (được định cấu hình thông qua CCSM và lxde-rc.xml, tương ứng) để bắt tín hiệu thoát khỏi pulseaudio --checkvà sau đó điều chỉnh âm lượng cho phù hợp:

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

Các kịch bản hoạt động tốt và ánh xạ tới các nút tốt, nhưng tôi không có cách nào tốt để xem phản hồi trực quan nữa - ngay cả với các pulseaudio kể từ khi tôi bắt các sự kiện nút (XF86AudioLowerVolume, v.v.). Rõ ràng là tôi chỉ có thể ánh xạ các phím âm lượng ALSA sang một thứ khác, nhưng không có ý nghĩa gì trong việc sao chép các phím tắt.

Tôi đã tìm thấy một điều khiển âm lượng python mà tôi có thể gọi trong các tập lệnh ở trên:
https://github.com/fishman/utils/blob/master/pvol.py

pvol.py -s hiển thị mức âm lượng hiện tại trên màn hình cho cả ALSA và pulseaudio, nhưng nó cực kỳ nhỏ so với OSD gnome tôi đã sử dụng và nó không thẳng đứng (thanh trên cùng, OSD cũ ở dưới cùng):

So sánh kích thước của OSD tiêu chuẩn và pvol.py

Vì vậy, tôi đã làm cho nó lớn hơn và lật nó xung quanh:

nhập mô tả hình ảnh ở đây

Nhưng, ngay cả khi chuyển hướng sang hướng dọc, chủ đề GTK mặc định màu xanh không hoàn toàn trơn tru như VLC (xem bên dưới).

Phần lớn những gì tôi đã tìm thấy khi tìm kiếm các triển khai OSD là các bài đăng về các lệnh gửi thông báo thiếu toàn bộ khái niệm thanh tiến trình. Mặt khác, nó chủ yếu là các thanh ngang (và rất nhiều trình giữ chỗ trong các tập lệnh bash). Thực sự tất cả những gì tôi cần làm là gọi amix & pactl, vì vậy một cái gì đó đơn giản như thanh tiến trình gtk trong pvol.py sẽ rất tuyệt - chỉ không quá xanh và không ở giữa màn hình.

VLC có một ví dụ điển hình về những gì tôi có trong đầu khi bạn cuộn bánh xe chuột ở chế độ toàn màn hình:

Thanh âm lượng dọc VLC

Nó ít gây cản trở hơn các hộp thông thường nằm ở giữa màn hình:

Thông báo khối lượng OSD ngang

Sự tương tự thanh trượt ngang hoàn toàn chưa bao giờ có ý nghĩa đối với tôi ngoài âm thanh lia giữa loa trái và phải.

Dù sao, làm thế nào mà các thông báo trên màn hình mặc định được gọi (đặc biệt là LXDE)? Tôi thấy rất nhiều bài viết về việc cấu hình các sự kiện nhấn phím, nhưng không nhiều về những kịch bản mà các sự kiện đó kích hoạt. Những lựa chọn khác là có trong bộ phận ưa thích theo chiều dọc?

Ngoài ra, có một số gói tôi nên gỡ cài đặt để ngăn xung đột nảy sinh giữa các sự kiện tôi đang xử lý thông qua các lệnh script và compiz hoặc openbox?

Cập nhật: Để tìm hiểu OSD tôi đang sử dụng, tôi đã không thay đổi cách xử lý nút tắt tiếng ngay lập tức. Giết xfce4-notifyd và sau đó nhấn nút tắt tiếng sẽ tạo ra một quy trình xfce4-notifyd mới, vì vậy tôi đã đoán biểu tượng loa lớn đến từ thứ gì đó như xfce4-volumed, nhưng tôi thực sự không cài đặt gói đó ... Ah ha! Giết gnome-settings-daemon dừng OSD lớn ở giữa màn hình.


1
LƯU Ý: Với LXDE, bạn phải tắt bảng điều khiển và hồi sinh nó khi bạn dừng pulseaudio hoặc lxpanel sẽ bắt đầu ăn CPU.
Adam

5
Wow những gì một câu hỏi tuyệt vời và cũng nghĩ ra! +1
Seth

Câu trả lời:


10

Được rồi, có nguy cơ trả lời câu hỏi của riêng tôi, tôi đã nghĩ ra một phiên bản pvol bị hack cùng nhau từ liên kết trong câu hỏi trên. Nếu không có gì khác, có lẽ người khác có thể cải thiện mã của tôi. Cuối cùng, tôi có kế hoạch loại bỏ các phần trong tập lệnh bên dưới mà không được sử dụng hoặc đưa các tập lệnh bash ra khỏi phương trình và có một tập lệnh pyqt xử lý tất cả các sự kiện nút. Ngay bây giờ, OSD hết giờ với tốc độ không đổi từ lần nhấn nút đầu tiên thay vì duy trì trong một khoảng thời gian cố định sau lần nhấn nút cuối cùng.

Chỉ cần sao chép, dán và lưu các tệp (có tên in đậm), đặt tất cả chúng vào cùng một thư mục, đặt các bit thực thi và sửa đổi các cuộc gọi hệ thống trong tập lệnh pyqt theo bất cứ nơi nào bạn lưu chúng hoặc đặt tất cả chúng vào thư mục đó trong đường dẫn của bạn. Sau đó ánh xạ các tập lệnh shell thành các lệnh Compiz, phím tắt Openbox hoặc một cái gì đó tương tự và thay đổi tập lệnh pyqt nếu bạn không sử dụng các nút âm lượng bàn phím đa phương tiện.

Lưu ý: Tên lớp Qvol là một tiêu đề hoạt động và tôi không buồn thay đổi nó. Cũng xin lưu ý rằng nút tắt tiếng không được xử lý - Đây chỉ là một nguyên mẫu để thể hiện một con đường khả thi để đáp ứng các tính năng được yêu cầu và hiện tại nó không được liên kết với bất kỳ loại dự án lưu trữ hoặc mô hình phát triển tiêu chuẩn nào. Bất kỳ loại phát triển quan trọng nào có nguồn gốc từ mã dưới đây có lẽ nên thuộc về Sourceforge, GitHub hoặc một trang web dự án. Điều đó nói rằng, hãy thoải mái chỉnh sửa câu trả lời này hoặc đề xuất một dự án hiện có cho phép tương tự về chức năng và thiết kế.

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

Các đối số "im lặng" cho các tập lệnh bash bước âm lượng là một kiểu hack giả - Các tập lệnh không thực sự làm bất cứ điều gì với đối số ngoài việc kiểm tra nếu nó tồn tại. Vì vậy, bạn có thể cắm bất cứ thứ gì trong đó với hiệu quả tương tự.
Adam
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.