使用对数刻度来调整音量和/或屏幕亮度

使用对数刻度来调整音量和/或屏幕亮度

我有一台 Acer Aspire E5-773G 笔记本电脑,运行带有 Unity Desktop 的 Ubuntu 16.04。

当我改变音量或屏幕亮度级别时(无论是使用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
    

    这样做的好处是每个用户都可以运行它而不需要特殊权限。但是它的细粒度不够。

  • 直接访问/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
    

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

答案1

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

#!/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

这取决于是否已xbacklight安装。

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

然后,我设置键盘快捷键(在我的情况下,是平板电脑的音量摇杆按钮)来触发/path/to/brightness.sh up/path/to/brightness.sh down

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

相关内容