Linux Ubuntu 扬声器每隔几秒就会爆音

Linux Ubuntu 扬声器每隔几秒就会爆音

我是 Linux Ubuntu 的新手,也是 Windows 的老用户,很高兴我做出了改变。设置台式电脑时,我每隔 2 秒就会听到扬声器发出烦人的重复“砰”声。无论音量大小,都会出现这种砰砰声。如果我拔下扬声器的音频插孔,只使用主板内置的扬声器,砰砰声就会停止。如果我播放声音,在播放声音时砰砰声会停止,大约 5 秒钟后,砰砰声又会恢复。

我正在运行 Linux Ubuntu 18.04.3 LTS。系统信息报告两个音频适配器,HDA-Intel - HDA ATI SB 和 HDA-Intel - HDA NVidia

我最终确实找到了解决这个问题的方法,但我没有足够的声誉点来发布问答。

答案1

操作系统的默认行为是 10 秒后关闭音频适配器以节省电量。此省电功能会导致爆音,可以禁用。

在终端类型中将sudo nano /sys/module/snd_hda_intel/parameters/power_save值从 1 更改为 0。

然后输入sudo nano /sys/module/snd_hda_intel/parameters/power_save_controller并将值从 Y 更改为 N。

在我的系统上,这立即解决了音频爆音问题。然而,在重新启动时,问题又出现了,我发现这些值已被重置。为了保持这些值持久,我必须添加一行代码,/etc/modprobe.d/alsa-base.conf 我在文件的最后一行代码后添加了这行代码,options snd-hda-intel power_save=0 power_save_controller=N

保存文件,一切就绪!

我的大部分信息来自这个视频:https://www.youtube.com/watch?v=Pdmy8dMWitg

我必须将“重启后持久性”部分拼凑起来,尽管我没有安装 TLP,但我的设置确实重置了。请注意,视频中的说法并非如此。

在我解决这个问题之前,我对 Ubuntu 非常失望。我希望这能帮助很多人解决他们的音频问题!

答案2

作为@Glen 回答的后续,这里有一个执行该任务的脚本:

fix_ubuntu_18_04_sound_pop_issue(){
    __heredoc__="""
    Script that fixes a popping sound due to a power saving feature

    References:
        https://superuser.com/questions/1493096/linux-ubuntu-speakers-popping-every-few-seconds
        https://www.youtube.com/watch?v=Pdmy8dMWitg
    """
    sudo echo "obtaining sudo"
    # First, there are two system files that need modification
    # Changing the values here should fix the issue in your current session. 
    cat /sys/module/snd_hda_intel/parameters/power_save
    cat /sys/module/snd_hda_intel/parameters/power_save_controller
    # Flip the 1 to a 0
    sudo sh -c "echo 0 > /sys/module/snd_hda_intel/parameters/power_save"
    # Flip the Y to a N
    sudo sh -c "echo N > /sys/module/snd_hda_intel/parameters/power_save_controller"

    # To make this change persistant we must modify a config file
    if [ -f "/etc/default/tlp" ]; then
        # Some systems (usually laptops) have this controlled via TLP 
        sudo sed -i 's/SOUND_POWER_SAVE_ON_BAT=1/SOUND_POWER_SAVE_ON_BAT=0/' /etc/default/tlp
        # This line contained a typo, addressed on 2020-10-11 11:11 Bcn time
        sudo sed -i 's/SOUND_POWER_SAVE_CONTROLLER=Y/SOUND_POWER_SAVE_CONTROLLER=N/' /etc/default/tlp
    elif [ -f "/etc/modprobe.d/alsa-base.conf" ]; then
        # Append this line to the end of the file
        text="options snd-hda-intel power_save=0 power_save_controller=N"
        fpath="/etc/modprobe.d/alsa-base.conf"
        # Apppend the text only if it doesn't exist
        found="$(grep -F "$text" "$fpath")"
        if [ "$found" == "" ]; then
            sudo sh -c "echo \"$text\" >> $fpath"
        fi
        cat "$fpath"
    else
        echo "Error!, unknown system audio configuration" 1>&2
        exit 1
    fi
}

答案3

作为 Glen 答案的补充,出于安全原因,最好使用sudoedit代替sudo nano。请注意,您还需要设置EDITOR环境变量。

因此,不要:

sudo nano /sys/module/snd_hda_intel/parameters/power_save

使用

EDITOR=nano sudoedit /sys/module/snd_hda_intel/parameters/power_save

而不是

sudo nano /sys/module/snd_hda_intel/parameters/power_save_controller

使用

EDITOR=nano sudoedit /sys/module/snd_hda_intel/parameters/power_save_controller

为什么sudoedit更好,在这个超级用户问题中得到了充分的解释,sudoedit:为什么要用它代替 sudo vi?

相关内容