GrabDuck

Тишина должна быть! или убираем щелчки в Ubuntu, когда ничего не играет

:

— Я — amlet, и я виндузятник :(
— Привет, amlet *applause*

В общем без долгих вступлений — короткая история решения проблемы появления щелчков, когда ничего не играет, с поправкой на ветер то, что я виндузятник, который хочет и пытается перейти на Linux. Может кому и пригодится. А тут ещё и сообщество закидает тухлыми помидоподскажет что-то: глядишь и умнее стану ;)

Начал я свой путь с Ubuntu. Погодите — рано кидатьНу потому что мне этот мир знаком только из сказокстатей, как на Linux всё радужно и здорово, но сразу в жесть падать типа Gentoo или Slackware инстинкт самосохранения не позволяет.

Так вот, поставил я на свой новенький, но уже явно устаревший Samsung NP350U2B (да, я ещё и самсунгу продался) Ubuntu последней версии, и стал жить-поживать, да чуда-чудное ждать, что всё станет само собой зашибись, всё рассосётся, мир во всём мире, а золотой дождь посыпится с неба… Да, Ubunt’а дала мне некоторые плюшки по сравнению с той же Windows 7, стоящей тут же на этом ноуте — самое заметное глазу: это меньшее количество тормозов — но счастье, как известно в мелочах (Стив, привет): выявилась одна раздражающая вещь, которая под горячуу руку ещё и жутко выбешивала…

Итак, краткое описание проблемы: когда не поступает никакого звука в наушники — начинаются щелчки, хотя должно быть просто тихо.

UPD: Тут описано решение, которое не до конца. Конечное решение проблемы вконце поста.

Особенностью проблемы было то, что если включить видео (например vlc) и поставить на паузу — щелчков не было. Я таким поганым хаком “решал” проблему несколько месяцев. Периодический поиск более конструкитивного решения проблемы постоянно приводил на подобные советы, которые к большому сожалению не очень-то совсем не работали :(

А тут как-то субботним вечером сел, чтобы радио-т послушать, а поскольку выпуск был негиковский, то от нечего делать решил увеличить свой локальный градус гиковости и решить-таки эту проблему окончательно. Кинул клич в чат (ну тут же гики вроде как собрались!). Откликнулся один товарищ — Sergey K., который навёл на файл:

/sys/module/snd_hda_intel/parameters/power_save

и что в нём необходимо 1 на 0 поменять. Пообщались, он подтвердил мои подозрения, что это как-то с экономией батарейки связано и пр. Он ещё что-то рассказал о том, что после перезагрузки значение в этом файле вернётся на круги своя, поэтому написал какой-то там хитрый скрипт, который во время загрузки каждый раз редактирует этот файл.

Ну я не такой умный. Да и это не совсем тот путь, который я ожидал. Хотя огромное ему спасибо за наводку. Именно этот файл и стал той отправной точкой моего гугления и поисков информации в man, чтобы найти-таки решение проблемы. И вот она заветная ласточка, которая и привела к окончательному решению проблемы: PowerManagement/ReducedPower

Прочитав по диагонали (умение, приобретённое во время ускореенного чтения лицензионных соглашений на Windows) моё внимание привлёк путь:

/usr/lib/pm-utils/power.d/

заглянул:

$ ls /usr/lib/pm-utils/power.d/
95hdparm-apm
anacron
disable_wol
intel-audio-powersave
laptop-mode
pci_devices
pcie_aspm
sata_alpm
sched-powersave
usb_bluetooth
wireless
xfs_buffer

А что это у нас за intel-audio-powersave?

$ vim /usr/lib/pm-utils/power.d/intel-audio-powersave

Листинг (не очень большой):

#!/bin/sh

# Allow the driver to put the audio hardware to sleep
# once the driver has been inactive for a second.
# This hook should work with at least the ac97 and hda codecs.

INTEL_AUDIO_POWERSAVE=${INTEL_AUDIO_POWERSAVE:-true}

help() {
cat <<EOF
— $0: Intel Audio powersave parameters.

This hook has 1 tuneable parameter.
INTEL_AUDIO_POWERSAVE = controls whether we will try to save power on battery.
Defaults to true.

EOF
}

audio_powersave() {
[ "$INTEL_AUDIO_POWERSAVE" = «true» ] || exit $NA
for dev in /sys/module/snd_*; do
[ -w "$dev/parameters/power_save" ] || continue
printf «Setting power savings for %s to %d...» "${dev##*/}" "$1"
echo $1 > "$dev/parameters/power_save" && echo Done. || echo Failed.
done
}

case $1 in
true) audio_powersave 1 ;;
false) audio_powersave 0 ;;
help) help;;
*) exit $NA
esac

exit 0

После небольшого раздумывания и прикидывания на глаз, методом научного тыка было получено удовольствиебыло решено и в результате воплощено исправить строчку:

INTEL_AUDIO_POWERSAVE=${INTEL_AUDIO_POWERSAVE:-true}

на

INTEL_AUDIO_POWERSAVE=${INTEL_AUDIO_POWERSAVE:-false}

Потом перезагруз, ожидания окончания загрузки и… О чудо: щелчков вроде как не слышно! А что у нас в упоминаемом выше файле от Sergey K.:

$ cat /sys/module/snd_hda_intel/parameters/power_save
0

Радость, веселье и общая вакханалия от непомерной радости и собственной крутости прилагается :)

UPD: Чего добивался, то и получил. Первый же помидор был в яблочко. По наводке Manitou необходимо проделать:

$ echo «INTEL_AUDIO_POWERSAVE=false» > /etc/pm/config.d/snd_hda_intel

после перезагруза:

$ cat /sys/module/snd_hda_intel/parameters/power_save
0