Portál AbcLinuxu, 7. května 2024 23:42

Na co se často ptáme: ALSA - II

22. 12. 2004 | Robert Krátký
Články - Na co se často ptáme: ALSA - II  

Konfigurace pomocí souboru .asoundrc. Použití pluginů. Mixování zvukových proudů z více zdrojů.

Konfigurace

Ačkoliv nám konfigurace přináší spoustu výhod, není pro základní funkčnost nutná. Chcete-li pouze občas přehrát empétrojku a netrápí vás, že nebude možné na úrovni ALSA mixovat více zdrojů zvuku, používat více karet nebo provádět jiné pokročilejší úkony, nepotřebujete nic více, než bylo řečeno v minulém díle. Stačí uložit rozumné hlasitosti a zařídit, aby se ovladače automaticky natahovaly (nebo byly v jádře neustále) a je hotovo. Není to tak, že dokud se člověk nepovrtá v nějakém konfiguračním souboru, nebude nic fungovat (ve většině standardních případů).

Samozřejmě se tak ochudíte o množství možností, které ALSA nabízí.

Veškerá konfigurace systému ALSA je soustředěna do souboru ~/.asoundrc (případně celosystémového ekvivalentu /etc/asound.conf - v dalším textu budu používat pouze název ~/.asoundrc, ale je jedno, ve kterém ze souborů budou údaje nakonec uloženy). Syntaxe tohoto souboru není nijak extra složitá, ale pro úplného začátečníka ani zcela triviální. Nevím, jestli bohužel nebo bohudík, ale způsob zápisu je poměrně flexibilní, takže se můžete setkat s mnoha podobami zápisu identické konfigurace.

Syntaxe

Kompletní (přehledný a troufám si tvrdit, že i pro neangličtináře srozumitelný) popis syntaxe naleznete v dokumentaci: Configuration files. Zde se tedy zmíním jen o úplném základu, jenž by vám měl bez dalšího studia postačit k porozumění příkladů, které budou následovat, nebo které naleznete na odkazovaných stránkách.

Pro většinu jednoduchých ukázek bychom si měli vystačit se dvěma pojmy: přiřazení hodnoty a pole.

Přiřazení:

název = hodnota
název hodnota;
název hodnota,

Přičemž rovnítko může být nahrazeno pouhou mezerou. Oddělení více přiřazení může být buď pomocí čárky, středníku nebo jen nového řádku. Všechny uvedené zápisy jsou tedy totožné.

Složené přiřazení:

Položka konfiguračního souboru může obsahovat hodnotu, která se sama skládá z dalších hodnot. Zapíšeme je tedy takto:

název = {
  hodnota = 1
}

název.hodnota 1

Oba zápisy jsou opět totožné.

Pole:

Pole lze zapsat podobně jako složené přiřazení (jen v případě použití závorek jsou tentokrát hranaté místo složených):

název [
  hodnota "raz"
  hodnota "dva"
]

název.1 = "raz"
název.2 "dva"

V reálném konfiguračním souboru však doporučuji zvolit jeden druh zápisu a toho se držet - nebo v tom bude akorát zmatek.

Jak to funguje

Soubor ~/.asoundrc definuje zvukové karty přítomné ve vašem počítači a poskytuje zároveň přístup k ovládání a nastavení pluginů z alsa-lib. Program podporující výstup na ALSA posílá svá data na tzv. PCM zařízení. PCM zařízení mohou být buď přímo zvukové karty nebo definovaná zařízení, která konfigurujeme pomocí parametrů a pluginů v ~/.asoundrc. Každé PCM zařízení může obsahovat mnoho virtuálních zařízení - ta je možné využívat k různým efektům. Pluginy jsou tím, co především umožňuje provádět všelijaká kouzla s kartou obsluhovanou ovladači ALSA.

Není-li definováno žádné virtuální zařízení, přistupují aplikace ke kartě pomocí zápisu

hw:0,0

kde první nula značí první kartu v systému, kdežto druhá nula označuje první zařízení na dané kartě. Neexistuje-li soubor ~/.asoundrc nebo není-li definováno žádné virtuální zařízení, používají všechny aplikace právě toto zařízení. Znaky hw jsou názvem základního pluginu, pomocí kterého jsou data na kartu (respektive ALSA ovladači v jádře) posílána tak, jak si přeje aplikace - nedochází k žádné úpravě na úrovni ALSA. Pokud bychom tedy chtěli poslat data na toto zařízení (což se normálně pochopitelně děje automaticky), zadali bychom např.:

aplay -D hw:0,0 soubor.wav

Pokud by však daný soubor měl jiné parametry, než jaké přesně karta očekává, zobrazí se chybová hláška:

$ aplay -D hw:0,0 GhostBusters.wav
Playing WAVE 'GhostBusters.wav' : Signed 16 bit Little Endian, Rate
44100 Hz, Stereo
Warning: rate is not accurate (requested = 44100Hz, got = 48000Hz)
         please, try the plug plugin (-Dplug:hw:0,0)

Je nám doporučeno využít plugin "plug", což je pravděpodobně nejužitečnější všeobecný plugin. Zařídí, aby byla zvuková data automaticky převedena do požadovaného formátu (v našem případě jde o vzorkovací frekvenci).

A teď již k praxi. Následuje výčet několika pluginů, které při běžném použití nejčastěji využijete. Popis všech PCM pluginů, které jsou v alsa-lib k dispozici, najdete na PCM (digital audio) plugins. Praktické příklady jsou také na stránce o souboru asoundrc.

Multiplexing

Mixování více proudů audia z několika zdrojů tak, aby mohly zvuková zařízení využívat všechny současně. Při běžném použití na desktopu se uplatní například v případě, že zatímco posloucháte rádio nebo písničky uložené na disku, pípne na vás ICQ nebo Jabber klient a dá vám tak vědět o nové příchozí zprávě. Kdyby multiplexing nefungoval, musela by aplikace, která se o použití zvukové karty přihlásí až jako druhá (třetí, čtvrtá, ...), čekat, až ji přestane používat aplikace, která ji předběhla. Kdyby šlo třeba o to rádio, mohlo by to trvat pěkně dlouho.

Stejný princip platí nejen pro výstup, ale i pro vstup. Uplatníme pro tento účel jiný plugin, ale nastavení se příliš lišit nebude. A finálním cílem je plně duplexní provoz, při kterém můžeme kartu využívat pro více zdrojů vstupu i výstupu zároveň.

Malá vsuvka: právě popisovanou funkčnost není nezbytně nutné řešit na úrovni ALSA. Stejných výsledků můžeme dosáhnout i pomocí tzv. zvukových serverů. Zvukový server je aplikace běžící na pozadí, která od programů požadujících přístup ke zvukové kartě tyto požadavky přebírá a sama softwarově zpracovává a pak teprve posílá již předžvýkaná data ovladači zvukové karty. Používáte-li ke své spokojenosti zvukový server, není nutné se zabývat nastavováním mixování přes ALSA.

Zvukové servery jsou např. esound (součástí GNOME), aRts (součástí KDE) nebo JACK. Všechny mají své výhody (v případě esound a aRts pohodlná provázanost s desktopovým prostředím) i nevýhody (představují další okliku na cestě, takže způsobují určité zatížení systému navíc - dříve se to týkalo především aRts). Nicméně je-li ve vaší distribuci již některý z těchto serverů používán a necítíte-li potřebu experimentovat, není důvod nutit se do překopávání systému.

Malá vsuvka číslo dvě: je také poměrně dost karet, které podporují multiplexing přímo hardwarově. Ani v takovém případě není pochopitelně nutné (a ani žádoucí) nosit dříví do lesa a cpát kartě softwarové mixování.

dmix

Ti z nás, kteří nemohou vystát aRts (třeba já) a jejich karta nepodporuje skoro nic, natožpak hardwarový multiplexing, si pomohou pluginem dmix. Před zapisováním do konfiguračního souboru můžete plugin vyzkoušet pomocí parametru na příkazové řádce. Zadáte-li ve více terminálech příkaz

aplay -D plug:dmix soubor.wav

mělo by to mít stejný efekt jako níže uvedené nastavení pro soubor ~/.asoundrc.

Konfigurace je jednoduchá, horší to může být s bezbolestnou podporou ze strany aplikací. Vysvětlím níže. Následujících několik řádek vložte do souboru ~/.asoundrc - nic víc není v současné chvíli potřeba.

pcm.!default {
        type plug
        slave.pcm "vystup"
    }
 
pcm.vystup {
    type dmix
    ipc_key 1024
    slave {
        pcm "hw:0,0"
        period_time 0
        period_size 1024
        buffer_size 4096
        rate 44100
    }
}

Postupný popis jednotlivých částí nastavení:

pcm.!default
Nejprve definujeme virtuální zařízení/plugin, se kterým budeme pracovat. Zároveň je to také název zařízení, které budou aplikace muset využívat, aby mělo toto nastavení kýžený efekt.

default je název, který je v knihovně ALSA předdefinován jako výchozí zařízení. My toho využíváme a pomocí znaku ! konfiguračnímu souboru říkáme, že naše definice default má přednost před tou, která je definována standardně. Pokud byste se rozhodli využít jiný název, nebude potřeba vykřičník. Ale také nebude možné očekávat, že bude zařízení bráno jako výchozí. Museli byste pak jeho název vložit jako parametr programu:

aplay -D název soubor.wav

Ačkoliv je default definováno implicitně jako výchozí zařízení, ne všechny aplikace to vědí/respektují, takže někdy se asi nevyhnete nutnosti zařízení v parametrech definovat, i když název ponecháte default. Z programů, které jsou "slušné" a berou default jako default ;-), jmenuji třeba MPlayer a Xine. U XMMS lze používané zařízení nastavit v dialogovém okně konfigurace výstupního pluginu ALSA.

type plug
Využíváme již zmiňovaný plugin "plug" k převodu do formátu očekávaného zvukovou kartou.
slave.pcm "dmixer"
Nadefinujeme "slave" (podřízený) plugin. V něm provedeme samotné nastavení potřebných parametrů.
pcm.vystup {
   type dmix
Podřízený plugin "vystup" bude typu "dmix".
ipc_key 1024
IPC (InterProcess Communication) klíč musí být unikátní integer. Číslo je využíváno pro vytvoření sdílené paměti. Chcete-li si být naprosto jistí, můžete použít ještě parametr ipc_key_add_uid yes. K IPC klíči pak bude připočtena hodnota aktuálního UID (což má však význam jen na víceuživatelských systémech).
slave {
    pcm "hw:0,0"
    period_time 0
    period_size 1024
    buffer_size 4096
    rate 44100
}
Definice podřízeného zařízení. Nejdůležitější je parametr pcm, který, jak jistě poznáváte, určuje zařízení, jehož se celá věc týká. Parametr rate udává vzorkovací frekvenci.

Ostatní parametry by teoreticky neměly být potřeba, ale některé karty se bez nich neobejdou (ICE1712 a VT82xx - využívající ovladač snd-via82xx). U nich je nutné nastavit velikost vyrovnávací paměti menší, než jakou karta má.

Pokud nemáte kartu zmiňovanou v posledním bodě, mohli byste si vystačit i s úplně jednoduchým nastavením:

pcm.!default {
        type plug
        slave.pcm "dmix"
    }

A hotovo. Takto stručný konfigurační soubor jste určitě nečekali :-).

Ještě však zbývá jedna záležitost. Máte-li aplikace, které umí využívat jen OSS, nikoliv ALSA (např. většina her), budete ten konfigurační soubor přeci jen muset trochu natáhnout (chcete-li využívat výhod mixování i s nimi). Přihoďte tyto řádky:

pcm.dsp0 {
    type plug
    slave.pcm "dmix"
}

Pokud používáte delší verzi souboru, musí vypadat třetí řádek takto

    slave.pcm "vystup"

aby odkazoval na naše vytvořené podřízené zařízení.

Nejjednodušší je volat programy, které posílají zvuk na OSS, pomocí kratinkého skriptu aoss. Najdete jej v balíku alsa-oss. Příklad:

aoss mpg321 GhostBuster.mp3

dsnoop

Plugin dsnoop je vlastně opakem pluginu dmix. Zatímco dmix skládá více proudů do jednoho, dsnoop vytváří z jednoho více. Používá se při nahrávání, tedy vstupu. Konfigurace je téměř stejná, využijeme však navíc jeden nový parametr: bindings. Parametr bindings určuje, kam budou posílány jednotlivé kanály. Můžeme jej sice využít i u dmix, ale většinou k tomu není důvod.

pcm.vstup {
    type dsnoop
    ipc_key 2048
    slave {
            pcm "hw:0,0"
            channels 2
            period_size 1024
            buffer_size 4096
            rate 44100
            periods 0 
            period_time 0
    }
    bindings {
            0 0
            0 1
    }
}

Rozdělíme tím vstup na dva kanály (0 namapujeme jak na 0, tak na 1).

asym

Pomocí pluginu asym můžeme zkombinovat to, co jsme zatím vytvořili. Měli bychom tak získat plně duplexní PCM. Zápis je opravdu jednoduchý:

pcm.kombinace {
        type asym
        playback.pcm "vystup"
        capture.pcm "vstup"
}

Díky tomuto nastavení můžete zároveň přehrávat i nahrávat. Podle reakcí v různých diskuzích nejsem sám, kdo si myslí, že podobná konfigurace by měla být nastavena jako výchozí... Proč uživatele trápit s editací konfiguračního souboru, když je to stejně očekávané normální chování zvukové karty? To se ostatně týká i softwarového mixování... I když... Je pravda, že jsem sám zmínil zvukové servery, které mnoha lidem dobře slouží (a které tyto funkce standardně poskytují). Hmmm, servery bych zrušil.

Příště...

...se snad konečně dostanu ke skutečně praktickým záležitostem. Přehrávání MIDI, řešení problémů, jako jsou špatná kvalita zvuku, zadrhávání, zamítnutý přístup k zařízením atd.

Nemohl jsem si nevšimnout požadavku, který se několikrát objevil v diskuzi u prvního dílu - totiž návod ke konfiguraci karet SB Live s 5.1. Bohužel takovou kartu nemám a nevím, kde bych ji honem sebral, takže nebudu moci poskytnout vlastnoručně ověřený postup. Ale jako domácí úkol jsem poctivě shromažďoval všechny možné poznatky od jiných uživatelů, takže snad budu schopen dát dohromady alespoň základní popis a především co nejvíce odkazů na další zdroje informací.

Tímto zároveň prosím uživatele těchto karet, kteří byli při jejich konfiguraci částečně nebo zcela úspěšní, aby mi poslali své poznatky a vůbec všechny informace, ze kterých by šel sestavit pokud možno co nejucelenější návod pro všechny ostatní. Kdyby se někdo dokonce odhodlal sepsat o tom celý článek, vůbec bych se nezlobil a mnoho čtenářů by mu určitě poděkovalo. Mohli bychom tak k našemu článku o nastavení se systémem OSS přidat ještě nový o ALSA.

Seriál Na co se často ptáme (dílů: 11)

První díl: Na co se často ptáme 1: LILO, poslední díl: Na co se často ptáme: Balíčkovací systémy.
Předchozí díl: Na co se často ptáme: ALSA
Následující díl: Na co se často ptáme: ALSA - III

Související články

Na co se často ptáme: ALSA
Na co se často ptáme: ALSA - III
Seriál: Na co se často ptáme
Seriál: Vypalování CD
Jak vytvořit vlastní DVD pod Linuxem
Kompilovanie jadra

Odkazy a zdroje

ALSA homepage
asoundrc
Syntaxe konf. souborů
PCM pluginy
DMix Plugin
Asym Plugin

Další články z této rubriky

Linuxové foto novinky: nejen darktable 2.2 a Rawtherapee 5
Linuxové foto novinky: GIMP konečně prolomil 8bit mez
DLNA v praxi: Android
Technologie DLNA na Linuxu v praxi – PS3 Media Server
Technologie DLNA na Linuxu v praxi – 1

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.