neděle 30. března 2014

PulseAudio a přehrávání hi-res zvuku na externím DAC FiiO E10


Pořídil jsem si lehce kvalitnější USB DAC (Digital to Analog Converter) se sluchátkovým zesilovačem FiiO E10 Olympus a na to konto se začal zabývat i nastavením zvukového systému Ubuntu tak, aby mi novou hračku nedegradoval. Takže takový lehký úvod k problematice zvukového systému PulseAudio s USB zvukovkou a pár odkazů kolem digi audia a downloadů hi-res nahrávek pro testování..



FiiO Electronics Technology CO., LTD. je čistokrevná čínská firma založená v roce 2007, která umí vyrábět "hodně muziky za málo peněz". V nabídce má řadu přenosných, i desktopových audiohraček zaměřených na náročnější posluchače a já z nich nakonec vybral E10 Olympus.

Olympus je miniaturní zařízení (nejdelší strana 8cm včetně výstupků) v bytelném hliníkovém pouzdru, konektory jsou zlacené a potenciometr hlasitosti prý také není úplný šmejd. Použitý DAC je schopný zpracovat audio s rozlišením 32/44.1/48/96 kHz @ 16/24 bit a připojuje se na běžný USB port počítače, ze kterého je také napájen. Cca metrový propojovací kablík s konektorem mini USB je přiložen. Má slušný výkon i pro sluchátka s vysokou impedancí a k dispozici jsou krom sluchátkového (s přepínatelným Bass Boostem) i linkový a koaxiální S/PDIF výstup. Díky velikosti a napájení přímo z USB je to ideální záležitost pro využití na cestách.


Instalace

V Ubuntu (ani jiných aktuálních linuxových distribucích) není potřeba nic instalovat, stačí připojit do USB a v nastavení zvuku vybrat patřičný výstup.

FiiO E10 se v nastavení zvuku zobrazuje jako DigiHug USB Audio. Pro spolehlivou funkčnost i pro probuzení počítače se spánku, je dobré aktivovat Analog Output.

Nastavení PulseAudia

PulseAudio je ve výchozím stavu nastaveno pevně na 16 bit / 44,1 kHz, v tomto formátu je drtivá většina muziky (je to rozlišení běžného CD) a cokoliv jiného na to přepočítá. Zvukové stopy filmů jsou ale zase všechny na 48 kHz (DVD/BR) a převzorkování 48 kHz na 44,1 kHz na první pohled nemůže být bezbolestné, zvuk to trochu pomrví, v závislosti na použitém resamplovacím algoritmu.

PulseAudio umí používat dvě různé vzorkovací frekvence, v konfiguračním souboru je možné nastavit výchozí a alternativní (ale pozor tato fíčura se objevila až v květnu 2012 ve verzi 2.0, takže uživatelé Ubuntu 12.04 mají smůlu). Většině běžných uživatelů tedy bude stačit nastavení zmíněných 44,1 a 48, aby si PA mohlo vybrat tu nativní. Pokud hodláte přehrávat i audio o vyšším rozlišení, např. 96 kHz, nastavíte si jako alternativu 96, čímž pokryjete i těch 48, resamplovat na dvojnásobek se dá bez artefaktů.

Globální nastavení Pulseaudia se nachází v souboru:

/etc/pulse/daemon.conf

Před editací nezapomeňte pro jistotu původní konfiguraci zazálohovat.
Nastavení si také můžete definovat zvlášť i pro konkrétního uživatele v jeho domovském adresáři, v souboru:

do Ubuntu 12.10
~/.pulse/daemon.conf

od Ubuntu 13.04
~/.config/pulse/daemon.conf

Sem si můžete zkopírovat výchozí nastavení z /etc/pulse/daemon.conf a to pak upravit. V configu uvidíte většinu řádků zakomentovaných středníkem, jsou to výchozí hodnoty, které se nastavují automaticky. Stačí tedy smazat středník a řádek upravit podle potřeby.

Já si pro začátek nastavil následující

default-sample-format = s24le
default-sample-rate = 44100
alternate-sample-rate = 96000

a restartoval Pulseaudio příkazem:

pulseaudio -k

Tento příkaz pulse ukončí, ale protože je v configu nastaveno automatické obnovení procesu, okamžitě se spustí znovu s novým nastavením.

Výchozí sample-format ideální pro použitou zvukovou kartu se dá zjistit třeba takto:

gdh@gdh:~$ pacmd list-sinks | egrep 'name:|sample'
    name: <alsa_output.pci-0000_01_00.1.hdmi-stereo>
    sample spec: s16le 2ch 44100Hz
    name: <alsa_output.usb-FiiO_DigiHug_USB_Audio-01-Audio.iec958-stereo>
    sample spec: s24le 2ch 96000Hz
    name: <alsa_output.pci-0000_00_1b.0.iec958-stereo>
    sample spec: s32le 2ch 44100Hz


Pro FiiO E10 je tedy vhodným formátem s24le. Číslo samozřejmě udává bitovou hloubku (přípona le určuje způsob řazení bajtů jednotlivých vzorků - little endian). Při přehrávání 16 bit audia na 24 bit převodníku se nic nepřepočítává, jen není využto nejnižších 8 bitů, které umožňují zvýšit dynamický rozsah nahrávky (až za hranici možností lidského sluchu). V praxi není při reprodukci ten rozdíl zásadní tak, jako vzorkovací frekvence, i na dynamicky neošulených nahrávkách. V uvedeném výpisu se vedle formátu daného kanálu zobrazuje i aktuálně nastavená vzorkovací frekvence - ta je daná nastavením PulseAudia a naposledy přehrávaným zdrojem. Vzorkovací frekvenci jsem nechal na výchozích 44,1 kHz a přidal alternativních 96 kHz. Víc alternativ PulseAudio bohužel nedovoluje a tak zvuk s jakoukoliv jinou vzorkovací frekvencí přepočítá na jednu z těch dvou.

Při nastavování parametrů výstupu pozor v případě, kdy hrajete třeba přes interní zvukovku, pro kterou není problém 32 bit / 192 kHz, ale pak vedete signál ven přes S/PDIF (ať už koaxem, nebo optikou), to pak musíte parametry přizpůsobit externímu převodníku, na ten systém nevidí.

Mixování stop s různou frekvencí

Teď trochu těch komplikací. PulseAudio se sice snaží použít nejpříhodnější vzorkovací frekvenci pro konkrétní stopu, ale nemůže logicky na jednom zařízení současně přehrávat zvuky s různou frekvencí. PA tedy nastaví vzorkovací frekvenci podle prvního zdroje v mixu a jakýkoli další automaticky přepočítává na tuto. Pokud nějaký zdroj na PA mixéru visí a drží ho na konkrétní frekvenci, jednoduše se vám stane, že si pustíte skladbu s vyšším rozlišením, ale na výstup vám místo 96 kHz poleze 44,1. Například typicky třeba flash na webové stránce drží audio, i když už nehraje. Zkrátka si člověk musí dát pozor, pokud chce všechno co nejdokonaleji. Napsal jsem si proto skript zjišťující aktuální stav audiosystému a ten si nechávám zobrazovat v Conky, tak mohu konflikty jednoduše podchytit. Celý skript ukážu někdy příště, ale základní diagnostiku najdete níže.

Převzorkování na jinou frekvenci

Z uvedeného vyplývá, že v určitých případech se převzorkování na "nekompatibilní" frekvenci nevyhnete. Když začnete řešit otázku kvalitního resamplingu, zjistíte, že PulseAudio umí využívat služeb několika knihoven, které mají různě efektivní algoritmy.

Metoda převzorkování je v souboru daemon.conf definována řádkem:

resample-method = speex-float-1

speex je výchozí knihovnou pro převzorkování (vlastně je to především kodek pro kompresi mluveného slova) a výchozí hodnota 1 je z rozsahu 0-10. Vyšší číslo znamená kvalitnější resampling, ale také vyšší zatížení CPU. Krom speex je možno použít další algoritmy, nadšenci nejčastěji doporučují:

resample-method = src‐sinc‐best‐quality

nebo na CPU méně náročný:

resample-method = src‐sinc‐medium‐quality


Tuto metodu zajišťuje knihovna libsamplerate a SRC je sice jednak zkratkou Sample Rate Converter, ale v tomto případě to autoři vtipně transformovali na Secret Rabbit Code.

Kontrola parametrů na výstupu ALSA

Výpis zvukových zařízení v systému:

gdh@gdh:~$ cat /proc/asound/cards
 0 [Intel          ]: HDA-Intel - HDA Intel
                      HDA Intel at 0xfdff8000 irq 47
 1 [HDMI           ]: HDA-Intel - HDA ATI HDMI
                      HDA ATI HDMI at 0xfdbfc000 irq 48
 2 [Audio          ]: USB-Audio - DigiHug USB Audio
                      FiiO DigiHug USB Audio at usb-0000:00:1a.1-2, full speed

Mé FiiO je tedy v systému jako card2. Když si budu chtít ověřit, zda řetězec přehrávač - PulseAudio - ALSA opravdu posílá těch 96 kHz, co zrovna přehrávám, až do převodníku, kouknu se až na konec:

gdh@gdh:~$ grep -r "rate:" /proc/asound/card*/pcm*p/*
/proc/asound/card2/pcm0p/sub0/hw_params:rate: 96000 (96000/1)

pcm*p jsou výstupní zařízení a pcm*c zachytávací (nahrávací). V /proc/asound/ toho můžete vyšťourat více, stejně jako v PulseAudiu pomocí příkazu pacmd.

Aktivace externí zvukové karty po připojení a probuzení počítače

Aby se zvuková karta aktivovala okamžitě po připojení k systému, je potřeba přidat jeden řádek:

load-module module-switch-on-connect

do konfiguračního souboru:
/etc/pulse/default.pa

Stejně se mi po probuzení systému ze spánku, že se mi místo externí zvukovky aktivuje interní. Napsal jsem si tedy skript, který umí nastavit výchozí kartu s potřebným profilem a přesměrovat na ní všechny přehrávané audio streamy. Do resume skriptu jsem si přidal následující řádek, který skript spouští:

su gdh -c "/home/gdh/bin/set-audio 6" &

Skript je třeba spouštět pod konkrétním uživatelem, "gdh" si v obou případech nahradíte podle potřeby, cesta samozřejmě také není závazná. Argument "4" odloží spuštění o 4 sekundy.

Skript pak vypadá následovně:

set-audio
#!/bin/sh
delay=0
[ -z $1 ] || delay=$1
sleep $delay
name="FiiO"
sink=$(pacmd list-sinks|sed -n "/name:.*$name/{x;s/[^0-9]\+//p};h")
echo "Setting default sink: $sink"
pactl set-default-sink $sink
card=$(pacmd list-cards|sed -n "/$name/{x;s/[^0-9]\+//p;q};h")
echo "Setting profile for Card: $card"
pactl set-card-profile $card output:analog-stereo
echo "Redirecting all streams to $name.."
pacmd list-sink-inputs|sed -n '/index/s/^.*: //p'|while read input
   do pacmd move-sink-input $input $sink >/dev/null; done 


Bit perfect přehrávání

V zájmu milovníka muziky je to, aby se na jeho kvalitní DAC dostala nahrávka v přesně takovém stavu, v jakém byla pořízena, tedy nejen bez převzorkování, ale také bez úpravy hlasitosti a dalších "vylepšení". Hodně se o tom diskutovalo, návody většinou doporučují určité přehrávače, které konfigurují tak, aby obešly Pulse a nastavují přímo ALSA. Z počátku bylo PA omezenější, dnes se to dá i s ním, když si dáte pozor, aby se vám mixer nezasekl díky jinému zdroji audia na jiné vzorkovací frekvenci.

Já používám konzolový MOC Player, který do zvuku bez vyzvání nehrabe a pomocí Audacity, jsem si ověřil, že mi na DAC leze opravdu přesně to, co mám na disku. Sice se MOC snaží používat výstup ALSA, ale stejně to posílá do Pulseaudia díky podstrčenému pluginu. Nastavil jsem nahrávání Audacity na parametry testované nahrávky, USB DAC nastavil v pavucontrol (nutno doinstalovat) na digitální duplex, pustil nahrávku přes mocp, nahrál kus z výstupu zpět, otevřel v Audacity i původní audiosoubor, srovnal pod lupou nahraný kus tak, aby časově přesně seděl k patřičné části originálu a pak jsem nahraný track invertoval a přimixoval do originálu. Podle očekávání dokonale vymazal originální záznam, tudíž byla nahrávka z výstupu identická se zdrojem a výstup mi nic neprasí. Stejného výsledku asi dosáhnete s mnoha dalšími přehrávači.

No a jaké to FiiO vlastně je?

Dlouho jsem pro přehrávání zvuku z počítače na sluchátkách používal vysloužilý kapesní MiniDisc přehrávač zapauzovaný v record módu, který jsem krmil z optického výstupu integrovaného Realteku. Sluchátkový výstup mého MD vůbec není špatný, ale má padesátiohmová sluchátka Sennheiser HD595 jsou na hranici jeho výkonu. Ovladač hlasitosti E10 pro stejný výkon vytočím sotva do třetiny a to je ještě na spodní straně přepínač zisku, který přidá k výchozím 3 dB dalších 7 dB, takže nejsou problémem ani hi-fi sluchátka s impedancí 300Ω.

Nejsem žádný "netopýr" (ale něco přes 17 kHz zas slyším) a nemám moc s čím porovnávat, takže mé hodnocení je v podstatě irelevantní. Co můžu říct je, že E10 má čistší a dynamičtější zvuk, než můj MD. Ovšem většina běžných nahrávek v CD (ne)kvalitě zní na tom MD lépe, než na E10, většinou mám takový méně příjemný pocit ze středů, které jsou čisté, ale většinou bych je trochu utlumil.. Když ale E10 nakrmím příhodnou hi-res nahrávkou, dostane se na úplně jinou úroveň a je radost to poslouchat. E10 má i přepínač pro zvýraznění basů, ale dost to přehnali, 3dB je moc, s třetinou by to mohlo být použitelné pro mnoho nedomrlých mixů.

Testovací nahrávky ve vysokém rozlišení

Abych mohl posoudit výhody hi-res audia na mém novém zařízení, začal jsem prohledávat web, abych sehnal patřičné vzorky, nejlépe stejné v CD kvalitě i 24/96 verzích, které bych mohl proti sobě testovat.

Na 24bit96.com naleznete řadu odkazů na stažení hi-res vzorků. Jestli jsem měl někde pocit, že mám zcela jasno v tom, že slyším rozdíl mezi 24/96 a 16/44, tak na bicích ze stránek LessLoss.com, kde naleznete výborné nahrávky pro takové přímé porovnání. Jak je ta nahrávka zvukově "řídká", dají se jednotlivé zvuky vnímat velmi detailně a 96 kHz prostě je slyšet a to zásadně. Zvuk je daleko plastičtější, zvuky oddělenější, radost poslouchat. Snad ten rozdíl nevznikl jen downsamplingem a ukazuje skutečné technické limity.. Zatím o této problematice nevím dost.
Update: Když jsem si uvědomil, že můj převodník sice umí 96 kHz zpracovat, ale analogový výstup má rozsah do 20 kHz a na vyšších frekvencích tíhne k aliasingu, začal jsem mít pochybnosti. Sluchátka mi zvládnou 38 kHz, tam rezerva je.

Na HiFiDUINO také najdete odkazy na stránky s legálními vzorky nahrávek s vysokým rozlišením, takže si můžete pro testování natahat jak vážnou hudbu, tak nějakou elektroniku a pokud si chcete porovnat rozdíly v reprodukci formátů z opačných konců spektra, můžete si stáhnout něco třeba z této stránky, kde jsou k dispozici i balíčky s 24/96 FLACy a MP3 najednou.


Něco o zvuku

Chcete-li se něco dozvědět o problematice digitálního záznamu, můžete se podívat na seriál Stopařův průvodce digitálním zvukem, první dvě kapitoly jsou základ.

Zpochybnění významu vyšších vzorkovacích frekvencí, bitové hloubky a další info ohledně digitalizace a opětovné "analogizace" audiosignálu naleznete v článku 24/192 Music Downloads ...and why they make no sense a pro názornost přímo ukážu na praktickou demonstraci s použitím měřící techniky. Je to dokonce velmi lunuxové, neboť v tom má prsty Red Hat.

Další zajímavou stránkou, na které si můžete zkontrolovat sluch, i zvukový systém je http://www.audiocheck.net. Například si můžete otestovat, zda ještě slyšíte 17kHz na Mosquito Tone Audibility Testu.



2 komentáře:

  1. Už po několikáté nahlídám a zvažuju že si ho též koupím, jen nevím zda to s koss porta pro má cenu, když jsem to asi 5 min zkoušel u kámoše widláka s podobnou PCIe zvukovkou do asusu, tak to o cosi lepší bylo.

    Jinak v 14.04 taktéž platí to nastavení pulseaudia nebo si to nastaví samo? Ono dost věcí je čím dál chytřejších, ale naopak jiné blbější :-D

    OdpovědětSmazat
    Odpovědi
    1. No, ona ta E10 neí špatná, ale stejně jsem si na ten zvuk ani po té době úplně nezvykl a to agresivnější střední pásmo mě trochu sere. To je snesitelnější, když zapnu bass boost, jenže jak jsem zmínil, je to moc a zase to kurví basy. Ale Porta Pro by vzhledem k svému charakteru zvuku mohla z E10 vytáhnout příjemnější zvuk, než můj čtyřikrát dražší Senheiser 595, asi to vyzkouším. Já jsem každopádně nekoupil dobře, už jen proto, že jsem si neuvědomil, že i když je převodník 96kHz, analogová část nedá víc, než 20 kHz a na vyšších kmitočtech trpí aliazingem. To, že má sluchátka umí 38 kHz je pak opravdu fuk. Ale to se opravdu netýká běžných nahrávek, to se týká víceméně především umělých testů. Ani já neslyším moc nad 17kHz, takže je to jen teoretická záležitost, jaký vliv by měly kmitočty nad 20 kHz na vnímání nahrávky.

      Jinak PA v Ubuntu udělalo od napsání tohoto zápisku pokrok v tom, že přidalo do výchozího nastavení k 44,1 kHz i alternativní frekvenci 48 kHz, což pokryje alespoň 99,9% požadavků.

      Smazat

Zkuste prosím při komentováni používat místo volby Anonymní volbu Název/adresa URL, kde vyplníte nějakou přezdívku, adresu zadávat nemusíte. Vědět, které příspěvky jsou od jednoho člověka, je fajn. Díky.

Pokud by se vám náhodou odeslaný komentář na stránce nezobrazil, vytáhnu ho z koše hned jak si toho všimnu. I Google spam filter se občas sekne.