16 янв. 2013 г.

[истории успеха]alsa -> oss v4 gentoo

Последнее время, довольно продолжительное - месяцы, стал замечать, что прослушивание музыки не приносит былого кайфа. Хотелось не продолжать слушать, а сделать потише и поскорее выключить. Так получилось, что в машине раньше была приличная акустика, а сейчас стоковое дерьмо. Дома система тоже исчерпала себя, как начальный hi-fi. Казалось, что проблема с усилителем. Переслушал в наушниках, слух явно не хуже, чем раньше, слышу всё.

Описать проблему тяжело и мало кто меня поймёт, однако наблюдалось явное урезание полосы частот. Не было слышно многих звуков, которые раньше были. Также звуковые образы имели тенденцию к уменьшению, рояль был каким-то небольшим и невесомым инструментом, без послезвучий, вокал девушки превращался в пискливое пение девочки, скрипка не походила на скрипку. Последней каплей стала попытка просмотра любимого фильма на DVD. Отлично помню, что полгода назад на нём был прекрасный отчётливый звук. Сейчас было полное впечатление от просмотра некачественной ТВ-программы. А образ DVD у меня тот самый, что и раньше. Стало очевидно, что проблема явно с софтом. И категорически не лечится старыми рецептами и шаманством с .asoundrc.

Ранее пробовал oss, но не проникся - сразу работать не хотело и удобных микшеров под это дело в пределах доступности не было. Перечитал устаревшие на 2 года wiki дистрибутивов gentoo и arch.

Оказалось, что достаточно:

1. пересобрать alsa и все зависимые звуковые модули модулями, а не статически.

2. добавить эти модули в blacklist, потому что они нам не нужны.

$ cat /etc/modprobe.d/alsa.conf

blacklist snd_ice1724 snd_ac97_codec snd_ice17xx_ak4xxx snd_pcm

3. откуда-нибудь поставить oss версии 4.x. Я сделал это через оверлей flora. layman -a flora; emerge oss

4. Добавить загрузку модулей и восстановление уровней в автозагрузку: rc-update add oss default

5. Очень важно апппаратно уменьшить громкость на усилителе. Там, где на alsa было -10dB, на oss играет -35dB.

6. Тестируем и смотрим, что вышло: ossdetect -v ; soundoff && soundon ; osstest

7. Пересобрать свои приложения с USE-флагами "oss -alsa"

Навскидку, плееры работают. С микшерами еще предстоит разобраться, но в OSS регулируется уровень по приложению. Полоса частот снова полная. Что было с alsa и когда оно возникло - тайна, покрытая мраком.

Апдейт, спустя неделю использования

Итак, на новой звуковой системе была детализация, но не хватало драйва и музыкальности. Голоса были какие-то хриплые, даже женские, ощущался недостаток высоких частот. После того, как я нашел новые виниловые рипы 96 kHz, а они играли как говно, это было печально...

В качестве твика был применен рецепт по изменению Sample Rate из АрчВики

Результат оказался ошеломительным. Гитара, как живая. Голоса - насколько это позволяет моя неважная акустика Monitor Audio RS1 и комната - натуральные. Верха есть. И самое главное - есть драйв!

Для моей звуковой карты, как оказалось, максимум поддерживающей 192000 Гц, оказалось достаточно выполнить команды:

sudo /usr/lib/oss/scripts/killprocs.sh
sudo vmixctl rate /dev/dsp 192000
sudo ossmix envy24.rate 192000
sudo ossmix envy24.ratelock ON
Еще не проверил, работает ли при перезагрузке, но надо добавить следующие команды
vmixctl rate /dev/dsp 192000
ossmix envy24.rate 192000
ossmix envy24.ratelock ON
в файл
/usr/lib/oss/soundon.user
и сделать его исполняемым
sudo chmod a+x /usr/lib/oss/soundon.user

Еще апдейт на следующий день

Изменения сохраняются. После перезагрузки частота дискретизации 192 kHz. Заработал звук в xbmc 12. Оказывается, он работает через libSDL. Пришлось пересобрать эту библиотеку без поддержки alsa и включив oss. Файл ~/.asoundrc следующий, но я не уверен, что он вообще задействован:

pcm.!default
 {
   type oss
   device /dev/dsp
}
mixer.!default
{
   type oss
   device /dev/dsp
}
Поиск микшера превратился в большую проблему. Всё, что есть, включая aumix и wsmixer и другие, даже декларирующие поддержку OSS, не работают. Возможно, потому что все они для oss v.3.x. Регулировка громкости по приложениям действительно есть по-умолчанию. Но мне неудобно постоянно переключаться на виртуальный экран с плеером deadbeef, а горячие клавиши на steelseries пока не поддаются настройке.

Патч для ядер >3.7.2 @ Patch for kernels >3.7.2

как применять:

cd /usr/lib/oss/build
vim patch
patch -p1 < patch
выбрать файл pci_wrapper.inc
./install для сборки и инсталляции модулей.
ossdetect -v
soundon

Для версии ядра Linux-3.14.0 применяется следующий патч для файла osscore.c:

--- setup/Linux/oss/build/osscore.c     2014-02-14 22:59:55.000000000 +0000
+++ setup/Linux/oss/build/osscore.c     2014-04-06 01:16:06.171974568 +0100
@@ -472,7 +472,9 @@
 int
 oss_get_uid (void)
 {
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,29)
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,14,0)
+  return __kuid_val(current->cred->uid);
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,29)
   return current->cred->uid;
 #else
   return current->uid;