owned this note
owned this note
Published
Linked with GitHub
---
slideOptions:
theme: solarized
---
# 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.
----

---
# Początki audio w komputerach
----
# PC Speaker
- Pierwszy raz zastosowany w komputerach IBM w 1981r .
- Był w stanie odtwarzać tylko jeden ton naraz.

----

----

----

----

----

---
# Początki audio w Linuxie:
---
# Karty dźwiękowe
----
## Sound Blaster

----
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:
----

---
# Jak działa ALSA?
----

---
# 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.

----
- 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```
----

----

----

----

---
# 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:
----

----

----
## 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.
----

----
## 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ąć.
---

---
# Serwery audio
----
Serwer audio odpowiada za mixowanie różnych strumieni danych, do jednego zunifkowane strumienia do urządzenia audio.
----

---
# JACK Audio Connection Kit
----

- 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.
----

----
## 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.
----

----
## 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)