вторник, 19 января 2016 г.

Linux + Asus Xonar U7 = HI-FI lossless & gaming

У меня имеется компьютер на базе Kubuntu 14.04 64bit и звуковая usb карта Asus Xonar U7 с  очень неплохими характеристиками. К карте подключены по аналогу бюджетные мониторы Behringer Ms40 и наушники Xiaomi  HI-FI  Headphones.


Мне  захотелось от этого всего зоопарка качественно проигрывать lossless flac и играть в игрушки ;)
Разберем как это реализовать...

Начнем с ядра... Самые свежие ядра берем отсюда http://liquorix.net/
Установка ядра:
sudo -s
echo "deb http://liquorix.net/debian sid main" >  /etc/apt/sources.list.d/liquorix.list
echo "deb-src http://liquorix.net/debian sid main" >> /etc/apt/sources.list.d/liquorix.list
apt-get update
apt-get install liquorix-keyring
apt-get install linux-image-liquorix-amd64 linux-headers-liquorix-amd64

Установка PulseAudio 8.0 с улучшенной поддержкой Xonar и ресемплера SoX:
с начал нужно поставить все зависимости для сборки пульсы (возможно придется еще что-то до устанавливать)
sudo apt-get build-dep pulseaudio && sudo apt-get install checkinstall libpulse-dev libsoxr-dev

Скачаем и соберем пульсу:
cd /tmp
wget http://www.freedesktop.org/software/pulseaudio/releases/pulseaudio-8.0.tar.xz
tar xf pulseaudio-8.0.tar.xz
cd pulseaudio-8.0

./configure --build=x86_64-linux-gnu  --prefix=/usr --includedir="\${prefix}/include" --mandir="\${prefix}/share/man" --infodir="\${prefix}/share/info" --sysconfdir=/etc --localstatedir=/var --libexecdir="\${prefix}/lib/pulseaudio" --srcdir=. --enable-x11 --libdir=\${prefix}/lib/x86_64-linux-gnu --with-module-dir=\${prefix}/lib/pulse-8.0/modules

make && sudo make install

Сделаем нашу пульсу realtime:
sudo -s
echo "@pulse - rtprio 99" >> /etc/security/limits.conf
echo "@pulse - nice -20" >> /etc/security/limits.conf
usermod -a -G pulse user
где user - имя вашего пользователя

Настройка pulseaudio, у меня /etc/pulse/daemon.conf имеет такой вид:

 allow-exit = yes
 high-priority = yes
 nice-level = -15
 realtime-scheduling = yes
 realtime-priority = 5
 exit-idle-time = 0
 scache-idle-time = 0
 enable-remixing = yes
 enable-lfe-remixing = yes
 default-fragments = 8
 default-fragment-size-msec = 5
 resample-method = soxr-vhq

 default-sample-format = s24le
 default-sample-rate = 192000
 alternate-sample-rate = 176400
 default-sample-channels = 2

 где  resample-method - качество ресемплинга, за sox ресемплер хорошо написано тут. Если с soxr-vhq проблемы при паузе/проигровании видео, то замените на spleex-float-10 
 default-sample-rate и alternate-sample-rate  - зависит от устройства.
 default-fragments и default-fragment-size-msec напрямую влияет на задержку в играх: меньше значение -> меньше лаг.

В файле модулей пульсы /etc/pulse/default.pa находим строки и меняем
load-module module-device-restore restore_volume=false
load-module module-stream-restore restore_volume=false
load-module module-udev-detect use_ucm=0 tsched=0

load-module module-suspend-on-idle timeout=0

Настроем SDL:
sudo echo "export SDL_AUDIODRIVER=pulse"  > /etc/profile.d/sdl.sh

Настроем OpenAL, правим файл /etc/openal/alsoft.conf : 
sample-type = float32
frequency = 44100
drivers = pulse 


Если у вас kde то вам  удобней будет переключить kmix с пульсы на альсу
sudo echo "export KMIX_PULSEAUDIO_DISABLE=1" > /etc/profile.d/kmix.sh



Перегружаем машину...

После загрузки если все зделано верно запускаем pavucontrol, открываем вкладку "Устройства Вывода" и давим зеленую пимпочку на против Xonar U7 - "Set as fallback"


Теперь игры, фильмы, ютуб буду играть на порядок лучше чем раньше.. Но а как же lossless? Об этом дальше...

Для получения Hi-Fi Bit-Perfect звука из lossless аудио нам понадобится плеер DeaDBeeF. Скачиваем, устанавливаем и запускаем.
DeaDBeeF имеет гибкий, расширяемый плагинами интерфейс.


По умолчанию в настройке стоит вывод звука через pulseaudio, лучше выбрать плагин ALSA Output Plugin с выводом через Pulseaudio.


Встроенный в новую пульсу ресемпллер SoX очень и очень неплох, но если вам хочется совсем уж полнейший Bit-Perfect то, для этого выбираем модуль ALSA Output Plugin и в устройстве вывода выбираем Xonar U7 - direct hardware device without any conversion. Так же все галки должны быть сняты...

Далее идем в Воспроизведение и отключаем нормализацию громкости

И последнее идем в Расширения, находим Alsa output plugin, жмем настройку, снимаем галку с ресемплера и ставим вторую...
 


Все, можем запускать любые флаки от 16/44.1 и вплоть до 24/192. Это честный bit-perfect! Единственное при  проигрывании  не будут воспроизводится другие звуки с пульсы (от мессенжеров и тд). Пульса будет ждать до нажатия на стоп в плеере. На работу самих программ типа браузера это не повлияет. Просто в браузере (у меня Chrome) видео не будет запускаться  до остановки проигрывания в DeaDBeef-е, но при  этом будет кешироватся. Если у вас аудио система с микшированием 2-х и более каналов, то спокойно можете на второй кинуть встроенную звуковуху и в пульсе для месседжеров и тд указать её.
Второй минус при смене трека, если следующий трек имеет другое разрешение (например первый 24/48, а следующий 24/192), будет слышен щелчок - это звуковуха меняет режим. Но этого можно избежать  слушая плейлист с одинаковыми разрешениями flac ;)
Такой способ актуален только на звуковых картах и ЦАПах с полным аппаратным перечнем частот семплинга. В U7 например 44.1K/48K/88.2K/96K/176.4K/192KHz @ 16bit/24bit, что охватывает весь популярный lossless контент. Если у вас нет хардверной поддержки например 176.4, то контент с таким разрешением уже без ресепленга не послушаешь :(  Благо есть выбор ресеплеров: SoX - для перегонки самих фамйлов, на лету в DeaDBeeF в DSP имеется не плохой ресемплер, в плагине ALSA, да хоть в том же Pulseaudio... Выбирать вам. Я после некоторого времени использования прямого подключения к alsa вернулся на пульсу+ресемплер soxr-vhq, звук в 44100 звучит более "плавней" что ли....

Полезные ссылки:
SoX Resampler  Plugin для DeaDBeeF на github: https://github.com/silentlexx/deadbeef_soxr
Компиляция (*-dev пакеты deadbeef и libsoxr должны быть установлены):
cd /tmp
git clone https://github.com/silentlexx/deadbeef_soxr.git
cd deadbeef_soxr/
./go

В настройках появится SoX Resempler


Lifehack 1:
Для бесшовного переключения между звуковыми картами в pulseaudio можно создать скриптик типа  /usr/local/bin/pasetsink.sh
#!/bin/bash
CARD=$(pacmd list-cards | grep "alsa.card_name" | head -n$[$1+1] | tail -n1 |  awk -F\" '{print $2}')
notify-send -i audio-card.png "Pulseaudio" "Вывод звука через  $CARD"
pacmd set-default-sink $1
pacmd list-sink-inputs | grep index | while read line
do
pacmd move-sink-input `echo $line | cut -f2 -d' '` $1
done

где первым параметром номер карты из pavucontrol "Устройства Вывода", где первая это 0, вторая это 1 и тд.
notify-send нужно до установить   sudo apt-get install libnotify-bin либо заменить на echo.
Эти скрипты можно повесить на хоткеи...
pasetsink.sh 1 в моем  случае включает Xonar U7, pasetsink.sh 2 - Встроенная.

Lifehack 2:

 Для отображения в виджете KDE ( STDOUT Plasmoid ) текущего состояния ЦАП создал скрипт ~/bin/dac.sh
#!/bin/bash
ALSAU=$(cat /proc/asound/U7/pcm0p/sub0/hw_params)
if echo $ALSAU | grep -q "closed"; then
  echo "DAC N/A"
else
BIT=$(echo $ALSAU | awk '{print $4}'| awk -F_ '{print $1}' | sed s/S//)
RATE=$(echo $ALSAU | awk '{printf "%0.1f",$10/1000}' )
echo "DAC ${BIT}bit/${RATE}kHz "
fi

В настройках STDOUT Plasmoid указать путь к файлу и интервал обновления.


Надеюсь эта статья будет полезной... Пишите в комvентареах что в неё еще можно добавить.

4 комментария:

RealEstate комментирует...

privet .. we love ffmpeg for win and android

on android

what would be a way & command

to say resize ALL videos in a folder (say mp4 WhatsApp videos) from 640 to 320

to save space?

and any alike software to do the same to all images?
and also reincode all voice notes?j to lower bit rate..

thank you!
- Andrei WhatsApp me at +1.718.974.4394 / nycles499 (at gmail.com)

Unknown комментирует...

resample-method = copy

rulet комментирует...
Этот комментарий был удален автором.
rulet комментирует...

Имеют ли смысл сейчас подобные настройки при выводе звука по usb или же по hdmi?
Например на Debian 10?