Obsługa dźwięku w Linuksie – cz. 1 ALSA 10


ALSA - logoSposób w jaki współczesne dystrybucje Linuksa obsługują dźwięk nie jest prosty i zdecydowanie nie wpisuje się w ramy reguły KISS (Keep it Simple). Wynika to głównie z historycznych zaszłości, licencjonowania, rozwiązywania tych samych problemów na różne sposoby, a w końcu rozwiązywania problemów, które nie istnieją. W tym cyklu artykułów postaram się przybliżyć czytelnikowi teorię związaną z działaniem i budową systemu dźwięku pod Linuksem ze szczególnym uwzględnieniem Ubuntu. Chociaż tematyka jest złożona i wielowątkowa, to pierwszy artykuł pragnę poświęcić na element będący podstawą obsługi kart dźwiękowych na współczesnym Linuksie, czyli ALSA.

ALSA to akronim angielskich słów Advanced Linux Sound Architecture (Zaawansowana Architektura Dźwięku Linuksa). Najkrócej mówiąc ALSA to zestaw sterowników do kart dźwiękowych na Linuksa wraz z interfejsem dla programów do korzystania z tych sterowników. Została wprowadzona do jądra Linuksa w wersji 2.5 jako odpowiedź na ograniczenia wcześniejszego interfejsu OSS3 (ang. Open Sound System). W jądrze 2.6 całkowicie usunięto OSS, a ALSA stała się jedyną oficjalną metodą zarządzania dźwiękiem obecną w Linuksie. Te decyzje doprowadziły do wielkiego rozłamu w obsłudze dźwięku w systemach Uniksopodobnych. Podczas gdy Uniksy (BSD, Solaris) postanowiły rozwiązać problemy OSS przez udoskonalenie tej technologii, to Linux zdecydował się na zastosowanie ALSA jako nowego, niekompatybilnego rozwiązania, w dodatku takiego, którego nie da się przeportować na inne systemy operacyjne.

Uproszczoną architekturę ALSA przedstawia poniższy schemat:

Przeanalizujmy obrazek (od spodu). Program wysyła sygnał do systemu, że chce uzyskać dany dźwięk. Do tego celu może wykorzystać API ALSA dostępne w przestrzeni użytkownika. Może też skorzystać z API starego OSS3, które jest emulowane przez ALSA (też przestrzeń użytkownika). Wreszcie aplikacja nie musi wcale korzystać z ALSA, a z bibliotek takich jak OpenAL, czy wrapperów GStreamer itp. Zadaniem tych bibliotek jest komunikacja z API ALSA. Następnie przechwycony sygnał jest miksowany w przestrzeni użytkownika i kierowany do części ALSA obecnej w jądrze systemu. Ta korzystając ze sterowników i mechanizmów jądra przekazuje go dalej do urządzenia audio, które następnie emituje dźwięk.

Jak widać ALSA można podzielić zasadniczo na dwie części. Sterowniki obecne w przestrzeni jądra oraz interfejs dla aplikacji będący w przestrzeni użytkownika. Dźwięk, który jest przetwarzany przez API ALSA może być przez nią miksowany. Jest to jedna z funkcji, której brakowało staremu OSS3 i która zaważyła o przyjęciu ALSA jako standardu. Dodatkowo ALSA zawiera API dla aplikacji korzystających ze starego OSS3 zapewniając z nimi kompatybilność. Warto też zauważyć, że takie aplikacje nie korzystają z mechanizmów ALSA odpowiedzialnych za miksowanie dźwięku, co skutkuje mniejszym opóźnieniem oraz lepszą jakością wydobywającego się dźwięku. Kolejną zaletą względem starego OSS3 było zniesienie ograniczenia, że tylko jedna aplikacja w danym momencie może korzystać z danego urządzenia audio. Ponadto ALSA charakteryzuje się bardzo dobrym przystosowaniem do korzystania z wielu rdzeni procesora (SMP).

Jednak system ten ma też swoje wady, które często są wytykane przez developerów innych rozwiązań. ALSA słynęła z problematycznych sterowników, relatywnie gorszej jakości od tych obecnych w OSS. W tym temacie jednak w ciągu ostatnich lat wiele się poprawiło. Wydana niedawno ALSA 1.0.25 przynosi ogrom zmian i poprawek. Ta też wersja programu znajdzie się w nadchodzącym Ubuntu 12.04 i miejmy nadzieję, że wyraźnie przyczyni się do ograniczenia problemów z jakością dźwięku. Kolejnym kłopotem (szczególnie dla programistów) jest bardzo złożone i słabo udokumentowane API. Jest to jednak obecnie znacznie mniejszy problem. Dlaczego? Ponieważ aplikacje tworzone przez programistów rzadko kiedy korzystają z API ALSA bezpośrednio. Na ogół używa się bibliotek OpenAL, SDL, GStreamer, Xine itp. To one odpowiedzialne są za obsługę słabo udokumentowanego API ALSA, a programista nie musi zawracać sobie tym głowy.  Do kolejnych wad ALSA można zaliczyć brak przenośności. Może być ona używana tylko na Linuksie i żadnym innym systemie operacyjnym. Nie można też miksować dźwięku różnie dla kilku aplikacji działających jednocześnie.

Sama ALSA jest wystarczająca, żeby zarządzać i odtwarzać dźwięk na Linuksie. Nie jest to jednak sytuacja, którą zastaniemy w Ubuntu. Deweloperzy postanowili rozbudować możliwości obsługi dźwięku poprzez dodanie tzw. serwerów dźwięku. Najbardziej spopularyzowany z nich PulseAudio znajduje się domyślnie w Ubuntu. Jest to jednak materiał na kolejny artykuł.



Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

10 komentarzy do “Obsługa dźwięku w Linuksie – cz. 1 ALSA