W wersji Androida 4.1 wprowadzono zmiany wewnętrzne w ramach mniejszej latencji ścieżki wyjścia audio. Wprowadzono minimalne zmiany w publicznych interfejsach API klienta lub interfejsach HAL. Ten dokument opisuje początkowy projekt, który z czasem ulegał ewolucji. Dobrze zrozumiany projekt powinien ułatwić OEM-om i producentom układów SoC prawidłowe wdrożenie go na konkretnych urządzeniach i układach scalonych. Ten artykuł nie jest przeznaczony dla deweloperów aplikacji.
Tworzenie ścieżki
Klient może opcjonalnie ustawić bit AUDIO_OUTPUT_FLAG_FAST
w parametrze audio_output_flags_t
konstruktora AudioTrack w C++ lub w AudioTrack::set()
. Obecnie tylko te klienci:
- Natywne dźwięki Androida oparte na OpenSL ES lub AAudio
- android.media.SoundPool
- android.media.ToneGenerator
Implementacja AudioTrack w C++ sprawdza AUDIO_OUTPUT_FLAG_FAST
prośbę i może opcjonalnie odrzucić ją na poziomie klienta. Jeśli zdecyduje się przekazać żądanie, zrobi to za pomocą bitu TRACK_FAST
parametru track_flags_t
metody fabrycznej IAudioTrack
IAudioFlinger::createTrack()
.
Serwer audio AudioFlinger sprawdza żądanie TRACK_FAST
i może opcjonalnie odrzucić je na poziomie serwera. Informuje klienta, czy żądanie zostało zaakceptowane, za pomocą bitu CBLK_FAST
w bloku kontroli pamięci współdzielonej.
Czynniki, które mają wpływ na decyzję:
- obecność wątku szybkiego miksera dla tego wyjścia (patrz poniżej);
- Częstotliwość próbkowania ścieżki
- obecność wątku klienta, który wykonuje moduły obsługi wywołań zwrotnych dla tego utworu;
- Rozmiar bufora ścieżki
- Dostępne terminy przyspieszonego rozpatrywania (patrz poniżej)
Jeśli prośba klienta została zaakceptowana, nazywamy to „szybkim przyjęciem”. W przeciwnym razie jest to „normalny ślad”.
Wątki miksera
Gdy AudioFlinger tworzy normalny wątek miksera, decyduje, czy utworzyć też wątek szybkiego miksera. Zarówno zwykły mikser, jak i szybki mikser nie są powiązane z konkretnym utworem, ale z zestawem utworów. Zawsze jest normalny wątek miksera. Jeśli istnieje, szybki wątek miksera jest podrzędny normalnemu wątkowi miksera i działa pod jego kontrolą.
Szybki mikser
Funkcje
Wątek szybkiego łączenia zawiera te funkcje:
- Miksowanie podmiksu normalnego miksera i maksymalnie 7 szybkich ścieżek klienta
- Wyciszanie na ścieżce
Pomięte funkcje:
- Konwersja częstotliwości próbkowania na utwór
- Efekty na ścieżce
- Efekty na miks
Kropka
Szybki mikser działa okresowo z zalecanym okresem 2–3 ms lub nieco dłuższym okresem 5 ms, jeśli jest to konieczne ze względu na stabilność harmonogramu. Ta wartość została wybrana tak, aby po uwzględnieniu całego bufora przepływu łączny czas oczekiwania wynosił około 10 ms. Mniejsze wartości są możliwe, ale mogą powodować zwiększone zużycie energii i możliwość wystąpienia usterek w zależności od przewidywalności harmonogramu procesora. Większe wartości, do 20 ms, są możliwe, ale powodują wzrost całkowitego opóźnienia, dlatego należy ich unikać.
Harmonogram
Szybki mikser działa z podwyższonym priorytetem SCHED_FIFO
. Wymaga ono bardzo mało czasu procesora, ale musi być wykonywane często i z małą zmiennością harmonogramu.
Jitter wyraża zmienność czasu cyklu: jest to różnica między rzeczywistym czasem cyklu a oczekiwanym czasem cyklu.
Uruchomienie go zbyt późno spowoduje błędy spowodowane niedostatecznym czasem. Uruchomienie procesu zbyt wcześnie spowoduje występowanie błędów spowodowanych pobieraniem danych z szybkiego ścieżki przed udostępnieniem danych przez ścieżkę.
Blokowanie
W idealnej sytuacji wątek szybkiego miksera nigdy nie blokuje, z wyjątkiem sytuacji w HAL.write()
Inne przypadki blokowania w Fast Mixer są uważane za błędy. W szczególności unikamy blokad typu mutex.
Zamiast tego używa się nieblokujących algorytmów (zwanych też algorytmami bez blokady).
Więcej informacji na ten temat znajdziesz w artykule Unikanie odwrócenia priorytetów.
Związek z innymi komponentami
Szybki mikser ma niewielką bezpośrednią interakcję z klientami. W szczególności nie widzi operacji na poziomie bindera, ale ma dostęp do bloku kontrolnego wspólnej pamięci klienta.
Szybki mikser otrzymuje polecenia od zwykłego miksera za pomocą kolejki stanów.
Poza pobieraniem danych o utworach interakcja z klientami odbywa się za pomocą zwykłego miksera.
Głównym odbiornikiem szybkiego miksera jest interfejs HAL dźwięku.
Normalny mikser
Funkcje
Wszystkie funkcje są włączone:
- Maksymalnie 32 ścieżki
- Wyciszanie na ścieżce
- Konwersja częstotliwości próbkowania na utwór
- Przetwarzanie efektów
Kropka
Okres jest obliczany jako pierwszy wielokrotny bezwzględny okres szybkiego miksera, który jest większy niż 20 ms.
Harmonogram
Standardowy mikser działa z podwyższonym priorytetem SCHED_OTHER
.
Blokowanie
Normalny mikser może blokować i często blokuje różne mutexy, a także blokuje przepływ danych, aby zapisać podmiks.
Związek z innymi komponentami
Normalny mikser intensywnie współpracuje ze światem zewnętrznym, w tym z wątkami bindera, menedżerem zasad dotyczących dźwięku, wątkiem szybkiego miksera i ścieżkami klienta.
Wyjście normalnego miksera jest blokującą rurą do ścieżki 0 szybkiego miksera.
Flagi
AUDIO_OUTPUT_FLAG_FAST
to podpowiedź. Nie ma gwarancji, że prośba zostanie spełniona.
AUDIO_OUTPUT_FLAG_FAST
to pojęcie na poziomie klienta. Nie pojawia się na serwerze.
TRACK_FAST
to koncepcja klient-serwer.