Audio & OS Linux (2. díl)

ALSA & JACK - Problematika zpracování audia v Linuxu
Audio & OS Linux 2 - main screen

Už víme, že i Linux lze použít pro profesionální práci se zvukem. Kde ale začít? Co, kde a jak zapojit? A jak to vlastně funguje z pohledu teorie? To vše se snad dozvíte v dnešním díle seriálu věnovaného spojení hudby a svobodného opera-čního systému Linux.

Minulým dílem jsme otevřeli problematiku práce se zvukem na Linuxu. Řekli jsme si něco o vnějším chování systému, o jeho fungování a použitelnosti, nehovořili jsme však zatím o samotném vnitřním principu vlastního zvukového systému. V první části toho dílu se proto budeme věnovat zvukové architektuře Linuxu, a to pěkně „od podlahy”, zatímco v druhé části textu si předvedeme praktickou ukázku zapojení externí zvukové karty a využití zvukového serveru JACK. Než se ale vydáme na naši cestu světem „linuxového audia“, krátce si shrneme historický vývoj zvuku na počítačích obecně.

Pohled do minulosti

V devadesátých letech minulého století byly všechny karty připojeny přes sběrnici ISA, nabízely silně omezené možnosti pro stereo přehrávání a zaznamenávání. Dostačovaly možná „pařanům“ počítačových her i „domácím“ hudebníkům, pro složitější operace byly však tyto karty nedostačující. Existovalo sice několik profesionálních karet s více kanály, většina z nich však nefungovala na Linuxu. Postupem času se přešlo na sběrnici PCI, jejíž upravená podoba PCIe se používá dodnes. Také popularita zvuku domácího kina a DVD možná „popostrčila“ vývoj audia „o kus dál“, a samozřejmě nemůžeme přehlédnout ani „dévédéčkům“ předcházející nástup CD. V souladu s technickým vývojem se přirozeně zlepšoval i výkon zvukových karet, takže relativně záhy se začaly stávat populárními externí karty připojované přes rozhraní USB, nebo třeba přes FireWire. Dnes už si tak každý může snadno vybrat, jestli obohatí svého „křemíkového drobka“ interní kartou, nebo jestli se poohlédne po nějaké externí variantě zvukové karty.

Toust jménem Linux

Nyní se ale už vraťme k Linuxu. Ten disponuje zvukovým systémem složeným ze dvou částí – z ovladače zařízení a ze zvukového serveru. První z nich pracuje s hardwarem na té nejnižší úrovni, druhý se pak stará o přístupy aplikací, mix zvuku a o další pokročilé funkce. Oproti operačnímu systému Windows, kde „dělba práce“ možná není tolik patrná, je zvukový systém Linuxu striktně rozdělen do více vrstev. V linuxovém jádru byl dříve jako základní zvukové rozhraní používán Open Sound System (dále jen OSS), který byl dále členěn do dvou vývojových linií. První linie byla součástí linuxového jádra, byla s ním distribuována a byla tak přirozeně volně dostupná. Druhá linie byla vedena firmou 4Front Technologies (kterou založil původní vývojář OSS) jako proprietární, tedy bez přístupu ke zdrojovým kódům. Přestože OSS „umělo“ některé nejznámější karty, se šíří podpory to v porovnání s OS Windows nebo MacOS nebyla žádná sláva. Některé ovladače zůstávaly přístupné jen v placené, proprietární verzi. Na druhou stranu díky tomu existovala alespoň nějaká podpora HW v Linuxu. OSS však obecně podporovalo jen základní zvukové funkce (chyběla hardwarová podpora MIDI, hardwarové mixování několika zvukových kanálů nebo třeba duplexní funkce).

Navíc vzhledem k tomu, že ovladač přistupuje k zařízení přímo, stává se, že v případě několika požadavků (například v případě běhu více aplikací) je nutné čekat na vyřízení aktuálního požadavku a pak teprve přejít ke zpracování požadavku dalšího. Jako řešení tohoho problému se ukázalo vytvoření zvukového serveru. Místo přímého přístupu ke kartě aplikace přistupují k tomuto serveru a ten dále zvukový signál přepojuje, míchá a podobně. Mezi tradiční linuxové zvukové servery patří například EsounD nebo aRts.

Bez problémů by to nešlo

Jak bylo naznačeno výše, OSS je poměrně jednoduchý a nemá pokročilé funkce. Mezi jeho nedostatky (vyjma těch již zmíněných) patří především limitovaný rozsah vzorkovací frekvence, dále to, že nutí přistupovat aplikace přímo k zvukovým zařízením, špatná podpora digitálního vstupu/výstupu, nebo značně omezené mixovací schopnosti. Připojení zvukového serveru sice řeší některé výše uvedené problémy – například dokáže konvertovat vzorkovací frekvenci – nicméně neřeší vše. Problém je v tom, že uvedený postup bude fungovat jen v případě, kdy všechny aplikace budou podporovat ten samý zvukový server. Bohužel situace bývá (bývala) jen málokdy takovémuto stavu nakloněna – preferování zvukových serverů se lišilo systém od systému.

Dalším problémem je zpoždění a synchronizace jednotlivých zvukových proudů. Víme, že získání co nejnižší latence je velice důležité při použití v realtimových aplikacích. Obvykle ani nepostřehnete nízká opoždění kolem 5 ms, problém je ale v synchronizaci aplikací – pokud by byla odezva příliš dlouhá, aplikace by se mohly začít rozcházet. Bohužel tyto zvukové servery nebyly napsány pro moderní architektury, tudíž nebyly použitelné ani pro operace, ve kterých je dbáno na přísnou synchronizaci. Jsou dostatečné pro jednoduché použití, na složitější operace jsou však nevhodné.

Další schopností, kterou u OSS postrádáme, je možnost propojování. Přestože jsou zvukové servery přizpůsobeny pro hromadný přístup aplikací, nemůžeme je mezi sebou za chodu svévolně propojovat, což téměř znemožňuje dynamické nakládání s prostředky, kterou profesionálnější práce s audiem vyžaduje. Stejná situace je i v oblasti MIDI. 

A nakonec: neméně důležitou „vlastností“, kterou jsme u systému OSS postrádali, bylo také „propojení“ lidí. Většina projektů a aplikací byla vyvíjena nezávisle na ostatních (nedobrá komunikace v řetězu: firmy – komunita – hlavní vývojář), což způsobovalo ne příliš „čitelný“ ani dynamický vývoj.

Návrat do současnosti

Výše uvedená situace naštěstí doznala značných změn. Velký podíl na tom nese český vývojář Jaroslav Kysela, který založil projekt ALSA (Advanced Linux Sound Architecture). Funkcionalita této architektury je do dnešních dnů neustále rozšiřována a hardwarová podpora pokrývá čím dál tím větší množství karet, včetně těch profesionálních. ALSA se stala i oficiální součástí nových verzí Linuxového jádra. Kódy jádra byly také upraveny tak, aby se eliminovalo co nejvíce „prodlev“ při zpracování zvuku, díky čemuž můžeme provozovat zvukový systém s latencí 1 až 2 ms.

Změna se udála i v komunitě okolo vývoje zvukových „prostředků“ – začalo se vést víc a víc diskusí mezi výrobci zvukových karet a mezi vývojáři. Někteří výrobci hardwaru začali přímo spolupracovat s projektem ALSA na vývoji linuxových ovladačů pro jejich „železo“. Dalšími skvělými novinkami bylo vytvoření LADSPA (plným názvem Linux Audio Developer Simple Plugin API) a JACKu (JACK Audio Connection Kit). První z nich je standard pro vývoj zvukových filtrů a efektů, mimo to se jedná o svobodnou alternativu k proprietárnímu VST. Druhý představuje profesionální zvukový server určený pro pokročilou práci s audiem, libovolné propojování aplikací, synchronizaci a podobně. V následujících odstavcích se na zvukový systém ALSA a JACK podíváme více z blízka.

ALSA

ALSA byla vyvinuta za účelem odstranění omezení tehdejších zvukových ovladačů, nepřímo její vývoj odstartovalo i proprietárnost některých části kódu tehdejší komerční větve OSS. Její návrh se řídil především těmito požadavky: oddělení jádra a uživatelské části, otevřenost, podpora hromadné práce s více zařízeními, zpětná kompatibilita s OSS. ALSA podporuje velkou škálu zvukových formátů. Oproti OSS využívá všech prostředků zvukové karty tak, aby nabídla co nejvíce funkcí. Upravena byla práce s MIDI, na výběr je tak buď přímý přístup k zařízení (práce se surovými „RAW“ daty), nebo přes tzv. sequencer, který se podobně jako zvukový server stará o míchání a distribuci signálu; navíc jej v případě potřeby může „odložit stranou“ a zaslat k vyřízení až později.

Ovladače samotné jsou složeny ze tří oddělených vrstev, což umožňuje např. poměrně snadnou tvorbu nových ovladačů, stačí se totiž starat jen o prvky jedné vrstvy komunikující s hardwarem, zatímco do dalších úrovní (vrstev) není potřeba zasahovat. Zajímavou část představují tzv. pluginy. Ty jsou zařazeny mezi samotný ovladač a aplikaci – fungují jako vstupní brána do systému ALSA. Zajišťují správu zařízení nebo konverzi formátů, pokud nativní komunikace mezi kartou a aplikací selhává.

Práce se zvukem vyžaduje „časovač“, který odpočítává čas mezi jednotlivými vzorky. Každá karta má takový časovač svůj, nezávislý na ostatních – to znamená že použití více než jedné karty může být problematické. Jednotlivé časovače se po určité době „rozejdou“ a jejich zvukové proudy tak nebudou synchronní. V ideálním světě bychom vždy použili jednu „schopnější“ kartu namísto několika „obyčejných“, protože ale v takovém světě nežijeme, existuje několik způsobů, jak při práci s více zařízeními zamezit zmíněnému rozcházení. Jednou z možností je právě použití pluginů JACKu. Těmi můžeme spojit dvě karty v jednu virtuální (tím si také ale například z tří zařízení po dvou výstupech vytvoříme „pět jedničkovou“ kartu). Spojení karet probíhá formou úpravy konfiguračních souborů, ve kterých „poskládáme“ novou pseudokartu složenou z karet reálných. Velmi podrobný návod lze najít na oficiálních stránkách JACKu na webové adrese http://jackaudio.org/multiple_devices.

JACK

JACK představuje zvukový server, určený převážně pro zvukové stanice. Jeho využití nalezneme hlavně v profesionálních zvukových aplikacích. Pro tyto účely splňuje podmínky synchronizace operací při nízké latenci i možnost snadného a flexibilního propojování aplikací. Na běžných systémech aplikace přistupují k zařízení „kdykoliv chtějí a potřebují“, to znamená, že zde chybí jakýkoliv princip synchronizace, který by zde nastoloval „pořádek”. Naproti tomu JACK (stejně jako moderní systémy CoreAudio nebo ASIO) disponuje systémem řízení, který každé aplikaci přidělí čas pro přístup k zařízení.

Všechny zvukové aplikace totiž přistupují k JACKu jako klienti. Každý klient má několik portů a jejich propojení, jak bylo řečeno, mohou být měněna za běhu. Samotný JACK může běžet nad různými systémy (ALSA, ale i OSS). Také je přenositelný co se týče architektury operačních systémů – poběží tedy jak na Linuxu, tak na Windows i MacOS, ale třeba i na Solarisu.

Praktická část

Teoretické „omáčky“ už jsme si užili jistě dost, přejděme proto k praktické části dnešního dílu. Díky laskavé pozornosti firmy Audiopro jsem měl možnost otestovat spolupráci linuxového systému s externími zvukovými kartami Creative E-MU 0202 a Creative E-MU 0204. Po připojení karty do USB systém sice nezobrazil žádné upozornění o tom, že by bylo přidáno nové zařízení, ale když jsem propátral systémové nastavení zvuku, nalezl jsem tam možnosti použití nového vstupního/výstupního zařízení, a to právě této karty. V této základní konfiguraci (kterou si systém provede sám) lze nastavit pouze jeden analogový vstup a výstup. Karta při přehrávání a nahrávání audia fungovala samozřejmě bez problémů.

Dalším krokem bylo využití všech vstupů karty. Spustil jsem si grafické rozhraní zvukového serveru JACK – QjackCtl. Pokud ho ještě nemáte, můžete jej získat instalací balíčku qjackctl. Nejdříve je třeba v jeho nastavení správně vybrat hardwarový vstup – po spuštění rozhraní proto přejdeme do karty „Nastavení programu” a jako vstupní a výstupní zařízení nastavíme naši připojenou kartu. Mimo to zde můžeme nastavit hodnotu „Snímky/Údobí“, tato hodnota výrazně ovlivňuje výslednou latenci. Já většinou používám 128. Hned pod tímto prvkem nalezneme i nastavení vzorkovací frekvence, ta udává intervaly mezi vzorkováním zdigitalizovaného zvuku. Čím vyšší frekvence, tím lepší kvalita zvuku, ale zároveň delší latence. S použitými kartami jsem mohl jít maximálně na hodnotu 48 kHz, ve vyšších frekvencích začal zvuk vypadávat (testováno na Intel Pentium 4 3,2GHz, 1GB Ram). V nastavení si můžete povšimnout i výběru ovladače, o kterém jsme se bavili v první části článku. Můžeme tedy vybrat například systém ALSA, PortAudio nebo OSS. V nastavení jsou i další volby týkající se vzhledu a podobně.

Jakmile máme JACK nastavený, můžeme jej „nahodit“ tlačítkem Spustit. Pro rychlé propojování vstupů a výstupů slouží karta Spojení. Na ní se nám objeví dva sloupce, z levého se čte a do pravého zapisuje. Jak vidíte, jednotlivé aplikace a zdroje jsou rozděleny do kategorií. Pokud chceme například propojit jen vstup a výstup karty, táhnutím myši spojíme capture 1 s playbackem 1 a 2 z kategorie systém. Tímto propojováním můžeme samozřejmě spojit i další aplikace, stačí je jen spustit a jejich porty se v tomto okně okamžitě zobrazí. Často se aplikace dokonce samy (nativně) propojí a není třeba nic měnit. Pro pohodlné a okamžité rozpojování jednotlivých nebo všech zapojení slouží (v případě, kdy je pospojováno opravdu více zařízení) tlačítka Rozpojit a Rozpojit vše. 

Další částí aplikace je Zapojovací deska. Můžeme na ní vytvořit zapojení (nebo načíst aktuální) a uložit si jej pro pozdější užití. Toto se může hodit v případě složitějších konfigurací spojení, které nechceme po každém novém spuštění nastavovat znovu. Okno Hlášení poskytuje přehledné informace o aktuální konfiguraci serveru i o probíhajících procesech (zatížení DSP, vzorkovací kmitočet, největší zpoždění času a další). Pokud se někomu nebude zamlouvat prostředí QjackCtl, může použít například konektor Patchage. Ten poskytuje např. rozdílnou plochu pro propojování aplikací, která může třeba někomu vyhovovat více. Jinak ale Patchage poskytuje stejnou funkcionalitu jako QjackCtl. Za „jiným obličejem“ se tak stále „ukrývají“ JACK a ALSA.

V dalším díle se budeme věnovat některým drobnějším aplikacím. Jakým, to si necháme jako překvapení pro laskavého čtenáře napovíme snad jen, že se bude jednat o aplikace (nejen) pro kytaristy.