# ALSA, Jack, Pipewire ## Karol Machoś --- # Audio w komputerze ---- Sample - pojedyncza próbka sygnału cyfrowego, służąca do reprezentacji sygnału analogowego. Sampling Rate - ilość próbek w czasie (44KHz - 44 tys probek na sekundę). Sample width - ilość bitów na próbkę . Channel - reprezentacja dzwięku pochodzącego z, lub trafiającego do pojedyńczego źródła/wyjścia. ---- ![](https://i.imgur.com/wyCh3Gj.png) --- # Początki audio w komputerach ---- # PC Speaker - Pierwszy raz zastosowany w komputerach IBM w 1981r . - Był w stanie odtwarzać tylko jeden ton naraz. ![](https://i.imgur.com/UOI4CbC.png) ---- ![](https://i.imgur.com/VB5LBrN.png) ---- ![](https://i.imgur.com/twfnxb1.png) ---- ![](https://i.imgur.com/2xwIgaD.png) ---- ![](https://i.imgur.com/1tACbNM.png) ---- ![](https://i.imgur.com/QwFrfsK.png) --- # Początki audio w Linuxie: --- # Karty dźwiękowe ---- ## Sound Blaster ![](https://i.imgur.com/v2UXW8S.jpg) ---- Z racji na swoją popularność wiekszość komputerów na przełomie lat 80 i 90, była wyposażona w tą kartę dźwiękową. Większość innych kart dźwiękowych była w stanie emulować jej działanie. ---- ## Open Sound System (OSS) ---- - Pierwsze zunifikowane API dźwiękowe na systemach Unixowych. - Powstało ze zbioru sterowników przygotowanych dla kart z rodziny Sound Blaster. - Wykorzystywało tradycyny unixowy framework oparty na open(), read(), write() poprzez specjalne urządenia. ``` cat /dev/random > /dev/dsp # plays white noise through the speaker cat /dev/dsp > a.a # reads data from the microphone and copies it to file a.a ``` --- # ALSA - Zastępnik dla OSS. - Jest w stanie emulować OSS. - Umożliwiła hardware mixing. - Wielowątkowość. --- # Architektura: ---- ![](https://i.imgur.com/Fh88dg7.jpg) --- # Jak działa ALSA? ---- ![](https://i.imgur.com/8hA1unf.jpg) --- # Otwieranie urządzeń ---- ## Charakterystyka Alsy: - Otwiera urządzenie tylko w trybie "Playback" lub "Capture". ---- Jedno urządzenie które może pracować jednocześnie w trybie "Playback" i "Capture" jest reprezentowane w Alsie jako dwa urządzenia. ![](https://i.imgur.com/oPn3HpD.jpg) ---- - zwiększenie bufora zwiększa latency. - połączenie i synchronizacja dwóch urządzeń za pomocą ```snd_pcm_link```. - dwa połączone urządzenia urochomią się w możliwie jak najmniejszym odstępie czaasu. --- # Konfiguracja ---- ## Problematyka: - Rozmiar bufora, format sampli, ilość dostępncyh kanałów są od siebie zależne. - Rozmiar bufora jest zależny od Sample Rate'u. ---- ## Rozwiązanie: N wymiarowa przestrzeń konfiguracyjna, będąca kombinacją wszystkich możliwych konfiguracji. - ```snc_pcm_hw_params_get_channels_max/min``` - ```snc_pcm_hw_params_get_rate_max/min``` - ```snc_pcm_hw_params_get_buffer_size_max/min``` - ```snc_pcm_hw_params_get_buffer_duration_max/min``` - ```snc_pcm_hw_params_get_format_list``` ---- ![](https://i.imgur.com/QtKRUPU.jpg) ---- ![](https://i.imgur.com/s2M0sxp.jpg) ---- ![](https://i.imgur.com/ODIP3DI.jpg) ---- ![](https://i.imgur.com/mXzY0p4.jpg) --- # Odtwarzanie audio: ---- - Alsa udostępnia bufor z którego korzysta urządzenie dzwiękowe (poprzez mapowanie) twojej aplikacji. - Do bufora możemy bezpośrednio zapisywać dane. - Możemy odpytywać alsę o aktualną ilość sampli które możemy zapisać do bufora. ---- # Idea działania bufora: ---- ![](https://i.imgur.com/R8CukiM.jpg) ---- ![](https://i.imgur.com/x8nwDzH.jpg) ---- ## Charakterystyka Alsy: - Zopytmalizowane wykorzystywanie pamięci. - Mała ilość przerwań systemowych. ---- ## Problematyka: - Nie możemy korzystać z tego samego bufora co na HW w naszej aplikacji. ---- 1. Buffer Size - rozmiar całości bufora w pamięci. 2. Period Size - ilość sampli po których odwtworzeniu dostaniemy przerwanie systemowe. 3. FiFo block size - ilość sampli które HW odczytuje/zapisuje z pamięci. ---- ![](https://i.imgur.com/TociuIL.png) ---- ## Period: - Przerwanie systemowe w momencie gdy Playback Pointer przejdzie przez period. - Po wywołaniu ```snd_pcm_wait```, przynajmniej jeden period jest gotowy do zapisu. - Potrzebujemy przynajmniej 2 periody na bufor, chyba że nie chcemy w ogóle używać przerwań. ---- ## FiFo Block: Bufor trzymam zarówno w urządzeniu dźwiękowym jak i w pamięci RAM naszego systemu. - Bufor w urządzeniu dźwiękowym składa się z jednego FiFo Block'u. - Bufor w ramie przechowuje ich wiele. - W momencie gdy urządzenie audio odtworzy jeden FiFo block, kopiuje kolejny z buforu w RAM'ie. - Rozmiar FIFO definiuje nam minimalne latency jakie możemy osiągnąć. --- ![](https://i.imgur.com/WZXGdnw.jpg) --- # Serwery audio ---- Serwer audio odpowiada za mixowanie różnych strumieni danych, do jednego zunifkowane strumienia do urządzenia audio. ---- ![](https://i.imgur.com/RfIDqqp.png) --- # JACK Audio Connection Kit ---- ![](https://i.imgur.com/h387agV.png) - Założony przez Paul'a Davis'a w roku 2002. - Defacto standard wśród profesjonalnych aplikacji audio. - Przede wszystkim zapewnia jak najmniejsze latency. - Wszystkie dane, są reprezentowane jako 32 bitowe liczby zmiennoprzecinkowe. ---- 1. Zapewnia wysoki poziom abstrakcji dla programistów, który absolutnie zwalnia ich z potrzeby zarządzania interfejsami urząądzeń audio i pozwala skupić się wyłącznie na funkcjonalności ich oprogramowania. 2. Pozwala aplikacjom wysyłać i odbierać audio zarówno od osiebie nawzajem, jaki i od interfejsów audio. Nie ma żadnej różnicy czy przesyłamy/odbieramy audio od innej aplikacji czy od interfejsu audio. ---- ## Architektura JACK: - Jeden format (float 32) - Jeden rozmiar bufora. - Podział kanałów na poszczególne porty. - Synchronizacja wszystkich clientów JACK. - Resampling i mixing outputu klientów. ---- - JACK mimo, że jest kolejną warstwą oprogramowania nad ALSĄ, nie dodaje żadnego latency od siebie, z racji na pełną synchronizację z cyklem ALSY. - JACK ogranicza ALSĘ do rozmiaru period będącymi potęgami 2ki - dyktuje to jakie rozmiary bufora są dla nas dostępne. ---- ![](https://i.imgur.com/c9IeL2J.png) ---- ## Użytkowanie JACK - wywołanie ```jack_client_open()``` aby połączyć się z serwerem. - zarejestrowanie "portów" do których i z których będą przepływać dane od i do aplikacji. - zarejestrowanie "process calback'u", wywoływanego przez serwer. - zasygnalizowanie JACK że aplikacja jest gotowa do przetwarzania audio. ---- ## Konfiguracja: ```=bash #!/bin/bash jack_control start jack_control ds alsa jack_control dps device hw:HD2 jack_control dps rate 48000 jack_control dps nperiods 2 jack_control dps period 64 sleep 10 a2j_control --ehw a2j_control --start sleep 10 qjackctl & ``` ---- ## Aktualny stan JACK? - JACK jest natywnie wykorzystywany jedynie przez wąski zakres aplikacji. - Aplikacje wykorzystujące PulseAudio średnio działają z JACK. - Nie da się jednocześnie używać JACK i PulseAudio. - Dwa równorzędne implementacje JACK: JACK1 i JACK2 zawierające nieco rózne funkcjonalności i implementacje, na szczęscie są kompatybilne ze sobą. --- # Przyszłość multimediów na Linuxie ---- # PipeWire <div style="width: 100%; justify-content: center; display:flex;"> <img style="width: 50%; image-rendering: pixelated;" src=https://pipewire.org/assets/pipewire.gif> </div> ---- ## Założenia PipeWire: - Przechwytywanie i odtwarzanie audio/video z minimalnym latency. - Przetwarzanie audio i video w czasie rzeczywistym. - Architektura umożliwiająca wielu aplikacją dzielenie się danymi. - Wsparcie dla PulseAudio, JACK, ALSA i GStreamer'a. ---- ![](https://i.imgur.com/58E9yEV.png) ---- ## Podstawowe funkcjonalności PipeWire: - Negocjacja formatów i buforów między połączonymi portami. - Zarządzanie przepływem danych w grafie. - Umożliwienie klientom łączenia się z obiektami, na podstawie przydzielonych uprawnien każdemu klientowi. ---- ## Obsługa audio: PipeWire obsługuje audio w zblizony sposób do JACK, jednakże w PW: - rozmiar bufora jest dynamiczny. Z racji na to latency wzrasta lub maleje, w zależności od potrzeb systemu. - dane przyjmowane od clientów są przyjmowane asynchronicznie. ---- ## Wideo: PipeWire jest w stanie utworzyć źródło obrazu z kamery, z którego potem może korzystać wiele aplikacji na raz. - PipeWire określa który client ma dostęp do zasobu. - Obraz z kamery może być współdzielony przez wiele aplikacji na raz. ---- ## Udostępnianie ekranu (Na Waylandzie :) ) GNOME zaimplementowało protal, który może zostać wykorzystany do zapytania PW o strumień naszego pulpitu. Portal najpierw odpytuje użytkownika o typ udostępniania ekranu do utworzenia, następnie PW tworzy odpowiedni strumien. Jedynie ten strumien jest widoczny dla aplikacji, a dane mogą swobodnie przepływać pomiędzy serwerem graficznym a aplikacją. ---- ## Aktualny stan PipeWire? - Ciągle zyskuje na popularności. - W kwietniu 2021 Fedora stała się pierwszym distro które defualtowo wykorzystuje PipeWire jako swój Sound Server. - Aktualnie bardzo nie wiele aplikacji wykorzystuje API PipeWire. ---- # Bibliografia: - [PIPEWIRE: A LOW-LEVEL MULTIMEDIA SUBSYSTEM](https://lac2020.sciencesconf.org/307881/document) - [Fabian Renn-Giles (Independent) - The Linux Audio API: A Different Way To Do Audio](https://www.youtube.com/watch?v=-wDVPreDNjE&ab_channel=TheAudioProgrammer) - [GUADEC 2018 - Wim Taymans - PipeWire](https://www.youtube.com/watch?v=0g4c6q2-hgw&t=454s&ab_channel=GUADEC) - [Sonoj 2019: Past, Present and Future of the JACK Audio Connection Kit](https://youtu.be/Zpvkn8DOScI) - [20 years of Open Source Audio: Success, Failure and The In-Between - Paul Davis](https://youtu.be/dk2AMwc4e2k) - [PipeWire Under The Hood ](https://venam.nixers.net/blog/unix/2021/06/23/pipewire-under-the-hood.html#whats-pipewire--quick-test-run) - [Mathematical Harmonies](https://amath.colorado.edu/pub/matlab/music/MathMusic.pdf)
{"metaMigratedAt":"2023-06-16T16:20:38.236Z","metaMigratedFrom":"YAML","title":"ALSA, Jack, Pipewire","breaks":true,"slideOptions":"{\"theme\":\"solarized\"}","contributors":"[{\"id\":\"b089228c-907a-4224-a4f7-bcb8703a7e29\",\"add\":12095,\"del\":2220}]"}
    343 views