Projektowanie z myślą o zmniejszeniu opóźnień

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:

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.