使用对数刻度缩放音量和/或屏幕亮度

Byt*_*der 5 sound unity brightness volume-control

我拥有一台运行 Ubuntu 16.04 和 Unity Desktop 的 Acer Aspire E5-773G 笔记本。

当我更改音量或屏幕亮度级别时(无论是使用Fn+Arrows还是通过例如音量指示器),缩放看起来都不自然。

亮度标度的上三分之一和音量标度的上四分之一之间的步骤几乎没有显着差异。

另一方面,亮度标度的下三分之一和音量标度的下四分之一中的滑块位置之间的步长似乎很大。特别是最低亮度设置比第二低设置(但不是关闭)要暗得多。

对我来说,这些尺度在技术上似乎是线性的,但由于人类的感官都是对数运作的,所以它们看起来很奇怪。有什么方法可以将主要亮度和理想情况下的音量缩放更改为更对数的缩放比例,以便步骤看起来更平等?


更新:

xbacklight无论出于何种原因,该工具都无法在我的机器上运行。但是,我找到了两种选择:

  • Dbus:您可以使用以下两个命令来获取/设置亮度值的百分比,即0-100范围内的整数:

    qdbus org.gnome.SettingsDaemon.Power /org/gnome/SettingsDaemon/Power org.gnome.SettingsDaemon.Power.Screen.GetPercentage
    qdbus org.gnome.SettingsDaemon.Power /org/gnome/SettingsDaemon/Power org.gnome.SettingsDaemon.Power.Screen.SetPercentage 42
    
    Run Code Online (Sandbox Code Playgroud)

    这样做的好处是每个用户都可以在没有特殊权限的情况下运行它。不过,它的粒度不那么细。

  • 直接访问/sys/...:您可以使用这些命令来获取/设置亮度级别为 0-x 范围内的原始整数。可以使用第三个命令找到实际的最大值 x:

    cat /sys/class/backlight/intel_backlight/brightness
    echo 42 | sudo tee /sys/class/backlight/intel_backlight/brightness
    cat /sys/class/backlight/intel_backlight/max_brightness
    
    Run Code Online (Sandbox Code Playgroud)

    这样做的好处是它提供了对硬件功能的直接访问,因此这是我们可以获得的最细粒度的控制。不幸的是,更改亮度值需要 root 权限(请注意sudoset-command 中的 )。

Mar*_*k L 2

这也困扰着我,至少对于亮度调整而言,所以我编写了以下脚本(编辑:在注释中添加了替代背光控制命令):

#!/bin/bash

current=`xbacklight -get`
# alternatively, if xbacklight does not work:
# current=`qdbus org.gnome.SettingsDaemon.Power /org/gnome/SettingsDaemon/Power org.gnome.SettingsDaemon.Power.Screen.GetPercentage`

scale="1 2 5 10 20 50 100"

case $1 in
    "down")
        # translate space to newline so tac will reverse order of lines (values)
        for val in $(tr ' ' '\n' <<< $scale | tac) ; do
            # scale = 3 to preserve some decimal values
            if (( $(bc <<< "scale=3 ; $val < $current/1.1") )) ; then
                newval=$val
                break
            fi
        done
        ;;
    "up")
        for val in $scale ; do
            # scale = 3 to preserve some decimal values
            if (( $(bc <<< "scale=3 ; $val > $current*1.1") )) ; then
                newval=$val
                break
            fi
        done
        ;;
    *)
        echo "Usage: $0 [up, down]"
        exit 1
esac

if [ "x$newval" == "x" ] ; then
    echo "Already at min/max."
else
    echo "Setting backlight to $newval."

    # thanks: https://bbs.archlinux.org/viewtopic.php?pid=981217#p981217
    notify-send " " -i notification-display-brightness-low -h int:value:$newval -h string:x-canonical-private-synchronous:brightness &

    xbacklight -set $newval -steps 1 -time 0
    # alternatively, if xbacklight does not work:
    # qdbus org.gnome.SettingsDaemon.Power /org/gnome/SettingsDaemon/Power org.gnome.SettingsDaemon.Power.Screen.SetPercentage $newval
fi

exit 0
Run Code Online (Sandbox Code Playgroud)

这取决于是否已xbacklight安装。

将其命名为brightness.sh,然后运行brightness.sh up​​或brightness.sh down将按脚本顶部指定的比例向上或向下步进。调用会notify-send触发屏幕亮度通知(至少在 Unity 中)。(我确信脚本可以改进一些,但它似乎工作得足够好。)

然后,我设置键盘快捷键(对于我的平板电脑的音量摇杆按钮,在我的例子中)来触发/path/to/brightness.sh up/path/to/brightness.sh down

要对音量执行类似的操作,您需要将调用替换为xbacklight可让您读取/设置音量并将通知更改为音量通知的命令。